命令模式,什么才有资格作为命令?

时间:2013-06-02 15:50:22

标签: design-patterns command powerdesigner

我有一个我的大学的项目,我正在使用PowerDesigner来建模应用程序,该应用程序应该是一个抽象的MS Visio,基本上是一个通用的图形编辑器。

我应该实现命令模式,但只关注实际的工作空间(而不是,例如,层次结构树)。现在,我有一个抽象类,它有一个名为execute()的抽象函数和一个名为undo()的空(但不是抽象)函数。我们的想法是让具体命令覆盖第一个方法,但只允许可撤销命令覆盖第二个方法。

我在理解什么是合格的命令方面遇到了一些麻烦。可撤销的方法有点容易命名,因为我有MoveResizeRotateAlterPropertyDeleteAdd。不可撤消的命令是问题。

工具栏上的每个操作都是命令吗?我在考虑将ZoomScroll作为一个命令,但我不确定这是否会成为一个命令。至于CutCopyPaste,第一个几乎是Clipboard元素列表的填充,之后调用Delete命令,而后两者几乎都在Clipboard列表中添加和删除,所以我不知道是否应该将其归类为命令。

基本上,问题是 - 如何处理不可撤消的命令?每个动作都应该创建一个命令对象吗?

1 个答案:

答案 0 :(得分:2)

缩放/滚动 - 为什么你认为它们不可撤销?撤消缩放 - >在更改之前设置缩放级别。撤消滚动 - >把位置移回去。在每种情况下,他们在创建时都会存储当前状态。您是否希望它们在撤消队列中是另一个故事。

剪切/复制/粘贴 - 一般来说,就撤消而言,我不希望剪贴板状态发生变化。但是你绝对希望从剪切中删除和粘贴中的添加是可以撤消的。如果您复制N个项目然后粘贴,那么是一个Add命令,还是多个?如果它是多个,您可能希望剪切/粘贴是应用添加子命令列表的元命令 - 否则,如果您粘贴N个项目,则必须撤消N次而不是一次。如果它是单个添加,那么它有点多余,虽然它可能很适合显示(例如"撤消粘贴"与#34;撤消添加......&#34 ;)

相同的逻辑适用于Cut。

简短的回答是:如果在您的代码中有意义,您可以将每个操作都作为命令。但它可能过度 - 你也可以在模型和视图之间分开,只有实际改变模型的东西才是命令/可撤销。