跳至主要內容

备忘录模式

荒流2021年10月27日大约 1 分钟约 336 字

1. 概念

所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

2. 示例

备忘录模式使用三个类 MementoOriginatorCareTakerMemento 包含了要被恢复的对象的状态,Originator 创建并在 Memento 对象中存储状态,Caretaker 对象负责从 Memento 中恢复对象的状态。

最后,客户端类 MementoPatternDemo 使用 CareTakerOriginator 对象来显示对象的状态恢复。

  1. 创建 Memento

    public class Memento {
       private String state;
     
       public Memento(String state){
          this.state = state;
       }
     
       public String getState(){
          return state;
       }  
    }
  2. 创建 Originator

    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

    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. 使用 CareTakerOriginator 对象

    public class MementoPatternDemo {
       public static void main(String[] args) {
          Originator originator = new Originator();
          CareTaker careTaker = new CareTaker();
          originator.setState("State #1");
          originator.setState("State #2");
          careTaker.add(originator.saveStateToMemento());
          originator.setState("State #3");
          careTaker.add(originator.saveStateToMemento());
          originator.setState("State #4");
     
          System.out.println("Current State: " + originator.getState());    
          originator.getStateFromMemento(careTaker.get(0));
          System.out.println("First saved State: " + originator.getState());
          originator.getStateFromMemento(careTaker.get(1));
          System.out.println("Second saved State: " + originator.getState());
       }
    }
    验证输出。
    
    Current State: State #4
    First saved State: State #2
    Second saved State: State #3