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