我认为,UNDO / REDO可以通过两种方式广泛实施。1.命令级别(称为命令级别撤消/重做)2.文档级别(称为全局撤消/重做)
命令级别:正如许多答案所指出的那样,这可以使用Memento模式有效地实现。如果该命令还支持记录操作,则很容易支持重做。
限制:一旦超出命令范围,就无法执行撤消/重做操作,从而导致文档级(全局)撤消/重做操作
我猜您的情况适合于全局撤消/重做,因为它适用于涉及大量内存空间的模型。同样,这也适合于选择性地撤消/重做。有两种原始类型
- 所有内存撤消/重做
- 对象级别撤消重做
在“所有内存撤消/重做”中,整个内存被视为连接的数据(例如树,列表或图形),并且该内存由应用程序而不是操作系统进行管理。因此,如果在C ++中将new和delete运算符重载为包含更具体的结构,以有效地实现诸如a的操作。如果有任何节点被修改,b。保持和清除数据等。它的作用方式基本上是复制整个内存(假设内存分配已由应用程序使用高级算法优化和管理)并将其存储在堆栈中。如果请求复制内存,则根据需要具有浅副本或深副本来复制树结构。仅对已修改的变量进行深拷贝。由于每个变量都是使用自定义分配分配的,该应用程序拥有最终决定权,何时需要删除它。如果我们需要对撤消/重做进行分区,那么事情就变得非常有趣,我们需要以编程方式选择性地撤消/重做一组操作。在这种情况下,只有那些新变量,删除的变量或修改的变量才被赋予标志,以便撤消/重做仅撤消/重做那些内存。如果我们需要在对象内部进行部分撤消/重做,事情将变得更加有趣。在这种情况下,将使用“访客模式”的新概念。它称为“对象级别撤消/重做” 或已删除的变量或已修改的变量都带有一个标志,以便“撤消/重做”仅撤消/重做那些内存。如果我们需要在对象内进行部分“撤消/重做”,事情将变得更加有趣。在这种情况下,将使用“访客模式”的新概念。它称为“对象级别撤消/重做” 或已删除的变量或已修改的变量都带有一个标志,以便“撤消/重做”仅撤消/重做那些内存。如果我们需要在对象内进行部分“撤消/重做”,事情将变得更加有趣。在这种情况下,将使用“访客模式”的新概念。它称为“对象级别撤消/重做”
- 对象级撤消/重做:调用撤消/重做通知时,每个对象都将执行流操作,其中,流媒体程序从对象中获取已编程的旧数据/新数据。不受干扰的数据不受干扰。每个对象都会得到一个流媒体作为参数,并且在UNDo / Redo调用中,它将流媒体/解流该对象的数据。
1和2都可以具有诸如1的方法。BeforeUndo()2. AfterUndo()3. BeforeRedo()4. AfterRedo()。这些方法必须在基本的“撤消/重做命令”(而不是上下文命令)中发布,以便所有对象也可以实现这些方法以获得特定的操作。
一个好的策略是创建1和2的混合体。美丽之处在于,这些方法(1&2)本身都使用命令模式