备忘录模式(Memento)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存着这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为模式类别。
备忘录模式实例
记忆模式使用三个演员类,备忘录包含要还原的对象的状态,发起者在Memento对象中创建并存储状态,对象负责从Memento恢复对象状态。无涯教程创建了 Memento , Originator 和 CareTaker 类。
演示类 MementoPatternDemo 将使用 CareTaker 和 Originator 对象显示对象状态的恢复。

第1步 - 创建Memento类。
Memento.java
public class Memento { private String state;public Memento(String state){ this.state = state; }
public String getState(){ return state; } }
第2步 - 创建Originator类
Originator.java
public class Originator { private String state;public void setState(String state){ this.state = state; }
public String getState(){ return state; }
public Memento saveStateToMemento(){ return new Memento(state); }
public void getStateFromMemento(Memento memento){ state = memento.getState(); } }
第3步 - 创建CareTaker类
CareTaker.java
import java.util.ArrayList; import java.util.List;public class CareTaker { private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state){ mementoList.add(state); }
public Memento get(int index){ return mementoList.get(index); } }
第4步 - 使用 CareTaker 和 Originator 对象。
MementoPatternDemo.java
public class MementoPatternDemo {
public static void main(String[] args) {
</span><span class="typ">Originator</span><span class="pln"> originator </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Originator</span><span class="pun">();</span><span class="pln">
</span><span class="typ">CareTaker</span><span class="pln"> careTaker </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CareTaker</span><span class="pun">();</span><span class="pln">
originator</span><span class="pun">.</span><span class="pln">setState</span><span class="pun">(</span><span class="str">"State #1"</span><span class="pun">);</span><span class="pln">
originator</span><span class="pun">.</span><span class="pln">setState</span><span class="pun">(</span><span class="str">"State #2"</span><span class="pun">);</span><span class="pln">
careTaker</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="pln">originator</span><span class="pun">.</span><span class="pln">saveStateToMemento</span><span class="pun">());</span><span class="pln">
originator</span><span class="pun">.</span><span class="pln">setState</span><span class="pun">(</span><span class="str">"State #3"</span><span class="pun">);</span><span class="pln">
careTaker</span><span class="pun">.</span><span class="kwd">add</span><span class="pun">(</span><span class="pln">originator</span><span class="pun">.</span><span class="pln">saveStateToMemento</span><span class="pun">());</span><span class="pln">
originator</span><span class="pun">.</span><span class="pln">setState</span><span class="pun">(</span><span class="str">"State #4"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Current State: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> originator</span><span class="pun">.</span><span class="pln">getState</span><span class="pun">());</span><span class="pln">
originator</span><span class="pun">.</span><span class="pln">getStateFromMemento</span><span class="pun">(</span><span class="pln">careTaker</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">0</span><span class="pun">));</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"First saved State: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> originator</span><span class="pun">.</span><span class="pln">getState</span><span class="pun">());</span><span class="pln">
originator</span><span class="pun">.</span><span class="pln">getStateFromMemento</span><span class="pun">(</span><span class="pln">careTaker</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">1</span><span class="pun">));</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Second saved State: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> originator</span><span class="pun">.</span><span class="pln">getState</span><span class="pun">());</span><span class="pln">
}
}
第5步 - 验证输出。
Current State: State #4 First saved State: State #2 Second saved State: State #3