我有一个我的大学的项目,我正在使用PowerDesigner
来建模应用程序,该应用程序应该是一个抽象的MS Visio
,基本上是一个通用的图形编辑器。
我应该实现命令模式,但只关注实际的工作空间(而不是,例如,层次结构树)。现在,我有一个抽象类,它有一个名为execute()
的抽象函数和一个名为undo()
的空(但不是抽象)函数。我们的想法是让具体命令覆盖第一个方法,但只允许可撤销命令覆盖第二个方法。
我在理解什么是合格的命令方面遇到了一些麻烦。可撤销的方法有点容易命名,因为我有Move
,Resize
,Rotate
,AlterProperty
,Delete
和Add
。不可撤消的命令是问题。
工具栏上的每个操作都是命令吗?我在考虑将Zoom
和Scroll
作为一个命令,但我不确定这是否会成为一个命令。至于Cut
,Copy
和Paste
,第一个几乎是Clipboard
元素列表的填充,之后调用Delete
命令,而后两者几乎都在Clipboard
列表中添加和删除,所以我不知道是否应该将其归类为命令。
基本上,问题是 - 如何处理不可撤消的命令?每个动作都应该创建一个命令对象吗?
答案 0 :(得分:2)
缩放/滚动 - 为什么你认为它们不可撤销?撤消缩放 - >在更改之前设置缩放级别。撤消滚动 - >把位置移回去。在每种情况下,他们在创建时都会存储当前状态。您是否希望它们在撤消队列中是另一个故事。
剪切/复制/粘贴 - 一般来说,就撤消而言,我不希望剪贴板状态发生变化。但是你绝对希望从剪切中删除和粘贴中的添加是可以撤消的。如果您复制N个项目然后粘贴,那么是一个Add命令,还是多个?如果它是多个,您可能希望剪切/粘贴是应用添加子命令列表的元命令 - 否则,如果您粘贴N个项目,则必须撤消N次而不是一次。如果它是单个添加,那么它有点多余,虽然它可能很适合显示(例如"撤消粘贴"与#34;撤消添加......&#34 ;)
相同的逻辑适用于Cut。
简短的回答是:如果在您的代码中有意义,您可以将每个操作都作为命令。但它可能过度 - 你也可以在模型和视图之间分开,只有实际改变模型的东西才是命令/可撤销。