【问题标题】:Undo-Redo repeated commands撤消-重做重复的命令
【发布时间】:2011-06-14 19:49:39
【问题描述】:
所以,我知道撤消/重做通常是通过命令模式实现的。
但是,当一个命令要重复x次时,撤消x次对用户来说会很麻烦。
例如,我有一个“int num”,当我在键盘上按“+”时,程序会执行“++num”。如果用户通过按“+”将num从0增加到50,那么用户想要撤消,我如何允许用户撤消一次,并且num会回到0。
如何实现撤消,使其能够处理一系列重复的命令?
提前致谢!
【问题讨论】:
标签:
undo
undo-redo
command-pattern
【解决方案1】:
Monitored Undo Framework (http://muf.codeplex.com) 通过使用批处理操作的概念来实现这一点。您可以将一组操作标记为属于一个组,以便撤消系统将撤消/重做它们作为一个工作单元。
此外,该库允许您通过仅存储给定字段的第一个/最后一个值来优化情况。这样,撤消/重做逻辑不必应用所有 50 个操作。它可以通过将值设置回撤消批处理之前的值来简单地撤消。
警告:MUF 库不使用传统的命令模式。它更多地使用备忘录模式,在底层域模型中发生更改后进行跟踪。
如果您需要一个真正的命令模式,那么您可以向撤消实现添加逻辑,以检查撤消堆栈上的条目。然后,例如,如果用户在“+”操作上点击撤消,堆栈将开始撤消,只要它一直在堆栈上找到“+”操作,就会继续撤消。在我无法批处理事件但希望撤消堆栈一次自动撤消多个操作的情况下,我使用了这种方法。