2009-05-21 47 views
0

我有两个基本上分离的应用程序,用于配置该公司出售的两件硬件。在一个基本表单中可以访问多个“应用程序”

我被要求将两个应用程序放在一起,以便它们可以在同一个程序中以可访问的方式访问。一个类比的想法是打开一个程序,选择一个文件打开,然后根据文件类型打开文档编辑器或电子表格编辑器。

这对于应用程序的大多数方面来说并不是特别困难,但是我的问题主要来自整合应用程序的主工具栏。两种不同的应用程序中的每一个都有自己的一组功能,这些功能与一组通用按钮有关,并且有自己的一组按钮。

我可以与类型检查代码中的按钮响应分开,即

If documentOpened.isSpreadsheet 
    spreadSheetFunction() 
Else 
    documentFunction() 

但这似乎凌乱的我,结合两个类的功能集成到一个臃肿的接口类。

有没有办法实现更大程度的封装,在这里,鉴于两个接口是如此不同?

回答

1

令人想到的是Visitor的设计模式(尽管它可能不适用于最严格的意义)。如果你定义了一个界面,它包含了工具栏上的所有按钮,然后为每个文档类型实现了一个类,这可以像Daniel所说的那样工作得很好。轮廓代码将是

public interface IToolbarHandler { 
    void ButtonOne; 
    void ButtonTwo; 
    //etc 
} 

public class SpreadsheetToolbarHandler : IToolbarHandler { 
    public void ButtonOne { 
     //Do Some action 
    } 
    public void ButtonTwo { 
     //Do Some action 
    } 
} 

public class DocumentToolbarHandler : IToolbarHandler { 
    public void ButtonOne { 
     //Do Some action 
    } 
    public void ButtonTwo { 
     //Do Some action 
    } 
} 

然后,只需有一个表格级变量是类型IToolbarHandler的和设置为当前正在观看的文档相关的处理程序的一个实例。然后你的工具栏事件处理程序简单地调用该变量的相关方法。

+0

好的,我会试试看。我猜这些非常见的按钮最终会以事件处理程序结束,这些事件处理程序在它们不出现的接口上不做任何事情...... – Frosty840 2009-05-21 13:38:07

1

我不知道.Net,所以这是一般的面向对象的编程建议。但是,你看起来像是在问一个通用的OO设计问题。

看起来你正在尝试做double dispatch;也就是说,根据两种不同的事情的运行时类型选择实际执行的代码。

传统的清理OO方式完成双派遣与visitor pattern。不要被这个名字或描述模式的例子所迷惑,以便走走某种含有结构的东西;即使你一次只有一个对象也是非常有用的!

基本上,你要做的是定义一些接口--CommonButtonHandler - 然后为电子表格和文档实现一个实现。当点击常见的“玩弄”按钮,你这样做:

// Inside CommonTwiddleButton.onClick() 
currentCommonButtonHandler.twiddleButtonClicked() 

有一些很好的例子在线使用双调度访问者模式的;只是一定要搜索这两个词,否则你最终会得到一堆访问者模式的例子,假设你需要走一些异类集合或一群lisp weenies吹嘘他们的对象系统如何多次调度默认。

相关问题