2009-11-27 88 views
1

在诸如Photoshop这样的工具中,您可以点击一些工具(例如笔,画笔等)。一旦你点击一个工具,你可以使用该工具来绘制,擦除等,具体取决于选择的工具。Photoshop风格的GUI设计

我想知道如何在OO设计中最好地实现。我只能想到有一个GUIManager总是知道选择了哪个工具,然后当Canvas(绘图区)检测到鼠标单击或鼠标拖动时,它向GUIManager询问选择哪个工具并应用该工具的行为。

有谁描述类层次的细节可能的解决方案(或任何细节,如果你没有时间)。

回答

1

看看它有准确的例子中,State Pattern

然而,这也不是一个GUI的问题,但更多的面向对象的方法如何建模这个问题。 GUI并没有真正扮演这个角色。

1

我不知道OO原则,真正发挥到这个,除非所有的图形元素是从公共基类在您选择的GUI可能产生的意义。

复杂的,需要的屏幕菜单点菜的Photoshop的等级大概矮成分之间VS继承VS函数式VS任何你想要的差别的应用程序的数量。

虽然,你应该有动机写程序使用不同风格的两倍,这可能是有趣的,看看结果。虽然我们认为面向对象的风格在我们还没有完全量化的方式中很重要,但各种编程风格的排名在这一点上是一个没有真正答案的悬而未决的问题。

1

对此的一个想法是有一个工具类。就在C++素描本 - 像伪代码:

class Tool 
{ 
public: 
    // Keep a pointer to the "document", i.e. some representation of the 
    // image you are editing 
    Tool(Document *pDoc); 

    // Process mouse events -- this need to be overridden to execute 
    // the appropriate behaviour depending on the concrete type of tool 
    virtual void OnMouseEvent(const MouseEvent &e) = 0; 

    // and so on 
}; 

然后,从这个抽象工具类继承提供具体的工具应用需求。当选择某个工具时,您可以实例化一个相应的工具对象并在某处记住它。该窗口将鼠标事件转发给当前活动的工具对象,然后为所选择的工具做适当的事情。

这是Johannes提到的国家模式的实现。