技术开发 频道

C#中使用备忘录模式实现Undo/Redo

  【IT168 专稿】

  关于Undo/Redo实现的基本思想

  正如我们所知,应用程序在每次操作后改变其状态。当操作应用程序时,它的状态会发生改变。所以,若有人想要做撤销,他不得不回到先前的状态。因此,为了能够回到先前状态,我们需要在应用程序运行时存储它的状态。要支持重做,我们不得不从目前状态跳到下一个状态。

  为了实现Undo/Redo,我们不得不存储应用程序的状态并在撤销时跳到前一个状态而在重做时跳到下一个状态。因此我们需要维护应用程序的状态来支持Undo/Redo。在所有三种方法中,应用程序状态的维护用到了两个栈。一个栈包含用于撤销操作的状态,第二个包含用于重做的状态。撤销操作弹出撤销栈以获取前一个状态并将其设置给应用程序。同样的,重做操作弹出重做栈以获取下一个状态并将其设置给应用程序。

  现在,我们知道了Undo/Redo的实现操作都是关于保持应用程序每次操作后的状态。现在的问题是该方法如何保存状态。在备忘录模式中,我们将保持容器的状态作为应用程序的状态。

  第一篇:C#中使用单个对象的方法实现Undo/Redo

  第二篇:C#中使用命令模式实现Undo/Redo

  关于备忘录模式

  这里我并不打算讨论备忘录模式,你可从这和这了解该模式相关信息。

  如何应用备忘录模式对任意应用程序Undo/Redo操作建模?

  备忘录模式在每个操作执行多级撤销/重做前存储应用程序的状态。为了使用备忘录模式实现撤销/重做操作,备忘录代表了Container对象的状态,而MementoOriginator创建了一个Container对象的备忘录(状态)。Caretaker将备忘录(状态)安全保存在两个栈中,一个用于撤销而另一个用于重做,并且它返回撤销备忘录和重做备忘录。一个撤销/重做类使用Caretaker来获得撤销备忘录(状态)和重做备忘录(状态),并完成撤销/重做操作。

  备忘录模式如何对任意应用程序Undo/Redo操作建模将在以下步骤中讨论:

  步骤1

  识别出你将要支持Undo/Redo操作的容器,然后识别出容器包含的对象以及可在不同的操作期间变化的容器的属性。

  步骤2

  创建一个备忘录类来包含这些对象和容器的可变属性,因此这个备忘录类可以代表容器上不同操作后容器的状态。

  步骤3

  然后创建MementoOriginator类,它负责创建任何时刻的容器备忘录并将其设置给容器。该类实现了两个方法getMemento()和setMemento(Memento memento)。getMemento()方法创建容器的备忘录并将其放回给调用方。而SetMemento(Memento memento)方法将一个memento(State) 设置给容器。

  步骤4

  然后创建保存memento(state)在两个栈中的Caretaker类。一个栈为Undo操作保存memento (state),而另一个为Redo操作保存memento (state)。该类实现了三个方法getUndoMemento (),getRedoMemento (),InsertMementoForUndoRedo (Memento memento)。GetUndoMemento ()为撤销操作返回一个备忘录。GetRedoMemento()为重做操作返回一个备忘录。InsertMementoForUndoRedo(Memento memento)将备忘录插入Undo/Redo管道并清空Redo栈。

  步骤5

  下面给出实现以下IUndoRedo接口的Undo/Redo类:

Collapse  Copy Code
  
interface IUndoRedo
    {
        
void Undo(int level);
        
void Redo(int level);
        
void SetStateForUndoRedo();
    }

  在Undo操作中:
  •首先从Caretaker获取UndoMemento
  •然后利用MementoOriginator把Undomemento设置给容器

  在Redo操作中:
  •首先从Caretaker获取RedoMemento
  •然后利用MementoOriginator把REdomemento设置给容器

  在SetStateForUndoRedo操作中:
  •利用MementoOriginator获取当前memento (state)
  •将当memento (state)前插入Caretaker以支持Undo/Redo

1
相关文章