无涯教程-Java 备忘录模式

30 阅读1分钟

备忘录模式(Memento)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存着这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为模式类别。

备忘录模式实例

记忆模式使用三个演员类,备忘录包含要还原的对象的状态,发起者在Memento对象中创建并存储状态,对象负责从Memento恢复对象状态。无涯教程创建了 Memento , Originator 和 CareTaker 类。

演示类 MementoPatternDemo 将使用 CareTaker 和 Originator 对象显示对象状态的恢复。

Memento Pattern UML Diagram

第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

参考链接

www.learnfk.com/design-patt…