0

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

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

我在理解什么是命令时遇到了一些麻烦。可撤销的方法有点容易命名,就像我有Move, Resize, Rotate,AlterProperty和. 不可撤销的命令是问题所在。DeleteAdd

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

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

4

1 回答 1

2

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

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

同样的逻辑也适用于 Cut。

简短的回答是:你可以让每一个动作都是一个命令,如果它在你的代码中有意义的话。但这可能是矫枉过正 - 您也可以将模型和视图分开,并且只有实际改变模型的东西是命令/可撤销的。

于 2013-06-03T06:51:10.913 回答