在Photoshop等工具中,您可以选择一些工具(例如钢笔,画笔等)。单击工具后,您可以使用该工具进行绘制,擦除等,具体取决于所选的工具。
我想知道如何在OO设计中实现最佳效果。我只能想到让GUIManager始终知道选择了哪个工具,然后当Canvas(绘图区域)检测到鼠标单击或鼠标拖动时,它会询问GUIManager选择了哪个工具并应用该工具的行为。
有没有人在班级详细信息中描述可能的解决方案(如果没有时间,可以详细说明)。
答案 0 :(得分:1)
请查看具有您的示例的State Pattern。
然而,它实际上并不是一个GUI问题,而是更多的是面向对象的方法来解决这个问题。 GUI并没有真正发挥作用。
答案 1 :(得分:1)
我不确定OO原则是否真正适用于此,除非所有图形元素都可能来自您选择的GUI中的公共基类。
需要屏幕菜单层次化的应用程序的复杂程度可能会使组合与继承与功能风格与您想要的任何内容之间的差异相形见绌。
虽然,如果你有动力使用不同的风格两次编写程序,看到结果可能会很有趣。虽然我们认为OO风格在我们尚未完全量化的方式中很重要,但各种编程风格的排名是一个没有实际答案的开放式问题。
答案 2 :(得分: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所指的State模式的实现。