在 Photoshop 等工具中,您可以单击一系列工具(例如钢笔、画笔等)。单击工具后,您可以使用该工具进行绘画、擦除等,具体取决于所选工具。
我想知道如何在 OO 设计中最好地实现它。我只能想到让 GUIManager 始终知道选择了哪个工具,然后当 Canvas(绘图区域)检测到鼠标单击或鼠标拖动时,它会询问 GUIManager 选择了哪个工具并应用该工具的行为。
有没有人在课程级别的细节中描述一个可能的解决方案(或者如果你没有时间的话)。
在 Photoshop 等工具中,您可以单击一系列工具(例如钢笔、画笔等)。单击工具后,您可以使用该工具进行绘画、擦除等,具体取决于所选工具。
我想知道如何在 OO 设计中最好地实现它。我只能想到让 GUIManager 始终知道选择了哪个工具,然后当 Canvas(绘图区域)检测到鼠标单击或鼠标拖动时,它会询问 GUIManager 选择了哪个工具并应用该工具的行为。
有没有人在课程级别的细节中描述一个可能的解决方案(或者如果你没有时间的话)。
看看有你的例子的状态模式。
然而,这实际上不是一个 GUI 问题,而是更多关于如何建模这个问题的面向对象的方法。GUI 并没有真正发挥作用。
我不确定 OO 原则是否真正发挥作用,除非所有图形元素都可能派生自您选择的 GUI 中的公共基类。
应用程序中需要分层的屏幕菜单 à la photoshop 的复杂程度可能会使组合、继承、功能样式和随心所欲之间的差异相形见绌。
虽然,如果你有动力使用不同的风格编写两次程序,那么看看结果可能会很有趣。各种编程风格的排名是一个悬而未决的问题,目前还没有真正的答案,尽管我们认为 OO 风格在我们尚未完全量化的方面很重要。
一个想法是有一个工具类。只是用类似 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 所指的 State 模式的实现。