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