好的,经验法则:如果您switch
在代码草图中看到一条语句,则表明您需要改用多态性。因此,在这种情况下,您希望能够进行各种操作,并且您发现自己想要 a switch
,因此您应该考虑“我怎样才能使用多态性来制作这个东西?”
现在,看看命令模式,你的对象是动词而不是名词。每个 Command 实现一个doThis()
方法;当您构造对象时,您确定命令将做什么。
public interface Command {
public void doThis(Graphics g); // I don't promise returning
// void is the best choice
// Would it be better to return a Graphics object?
}
public class DrawRectangle implements Command {
public DrawRectagle( Point topLeft, Point btmRight) { // ...
}
public void doThis(Graphics g){ // ...
}
}
现在,考虑一下如果你想实现undo会怎么做?
更新
好的,让我们再扩展一下。使用这种模式的目的是确保客户不需要知道那么多,除非您在进行原始构造。所以对于这个例子,让我们考虑绘制一个矩形。当您选择矩形工具时,您将在按钮单击事件处理程序上有一些代码(顺便说一句,这都是伪代码)
cmdlist = [] // empty list
bool firstClick = true
Point tl = br = new Point(0,0)
onClick:
if firstClick:
get mouse position into tl
firstClick = false
else:
get mouse position into br
cmdlist.append(new DrawRectangle(tl, br))
firstClick = true
因此,现在当您选择矩形时,您将 DrawRectangle 对象添加到命令列表结构中。一段时间后,您浏览了列表
for cmd in cmdlist:
cmd.doThis(Graphics g)
这些事情就完成了。现在应该很明显,您将通过向 Command 添加“undoThis”方法来实现撤消。创建命令时,您必须构建代码,以便对象知道如何撤消自身。然后 undo 意味着只从列表中取出最后一个 Command 对象并执行它的 undoThis 方法。