2011-07-04 59 views
0

我想收到有关如何编程模式的想法。我的意思是创建具有不同行为的应用程序,这些行为由选定模式定义,例如图像编辑器中的这些模式。 让我们来举例说明:我有一个应用程序允许我放置块并用箭头将它们连接在一起。所以我可以使用模式移动块,模式删除块和或箭头,我可以选择创建块之间的链接,或编辑块。所以我的想法是针对我想要的每种类型的行为,我在工具栏中选择一个按钮。单击任意按钮,鼠标输入的行为将根据我的需要进行处理。版本模式设计模式

+1

会是使用工厂模式的情况? –

+0

换句话说,你试图在'vim'中模拟模式行为? – GWW

+2

我认为GOF书会对你有很大帮助:http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612 潜入国家/战略模式并告诉我们它如何去。 一些有趣的资源: http://www.dofactory.com/Patterns/PatternStrategy.aspx http://www.dofactory.com/Patterns/PatternState.aspx – nick2083

回答

0

我会尽力给你解释你发布的例子(谢谢)。让我知道如果我失去了一些东西。

我会模拟一个abstract class Tool,它提供了所有工具必须遵守的通用协议。这是一个消息,用于建模使用该工具的行为,另一个消息用于建模释放它的行为(就像当您使用铅笔时,您停留在表面上,使用它并再次提起它一样)。类似于RestOnRaiseUp

您需要使用工具(Block s或Link s)下的Element s,并指定一个类让您知道哪些元素在工具指针下。它可能是一个Canvas类。

然后,您可以实现从ToolHand Tool,EraseTool等)创建继承树的特定工具行为。

对于工具栏的按钮整合,我将做到以下几点: 在Tool类,它提供每个工具的唯一实例(单例模式)定义了一个静态方法/属性:在

abstract class Tool { 
    abstract void RestOn... 
    abstract void RaiseUp... 

    static Tool HandTool() { return _handTool; } 
    static Tool EraseTool() { return _eraseTool; } 
    .... 
} 

然后工具栏的按钮处理程序,你必须像

btnHandTool_click(...) { 
    _canvas.SetActiveTool(Tool.HandTool()); 
} 

btnEraseTool_click(...) { 
    _canvas.SetActiveTool(Tool.EraseTool()); 
} 
... 

每种工具polimorphycally相对于抽象类的事实Tool会让你忘记回合编写特定的代码来判断活动工具是否为HandTool或EraseTool实例。 您可以查看是否改变了canva活动工具的策略(模式)。在内部,类不能告诉正在使用的活动工具的实现。它只知道它可以响应的消息。

最后,但很重要的,你会被丽贝卡夫斯 - 布洛克发现在exelent命名设计面向对象的软件一章专门建立一个绘图应用程序与它的工具集,展示了不同您可以用于建模的技巧。 我会建议你抓住它,并看看,它真的值得的时间。

0

状态模式非常适合这类工作。