设计模式——行为型模式_备忘录模式

1. 类图

备忘录模式的 UML 图

2. 角色

  • Memento:包含了要被恢复的对象的状态
  • Originator:创建新的Memento;或者设置Memento中的状态
  • CareTaker:记录Memento的历史状态

3. 代码

  • Memento
    • public class Memento {
         private String state;
       
         public Memento(String state){
            this.state = state;
         }
       
         public String getState(){
            return state;
         }  
      }
  • 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();
         }
      }
  • 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);
         }
      }
  • 客户端调用
    • 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());    //Current State: State #4
            originator.getStateFromMemento(careTaker.get(0));
            System.out.println("First saved State: " + originator.getState());    //First saved State: State #2
            originator.getStateFromMemento(careTaker.get(1));
            System.out.println("Second saved State: " + originator.getState());    //Second saved State: State #3
         }
      }

4. 总结

优点

  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  • 实现了信息的封装,使得用户不需要关心状态的保存细节

缺点

  • 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存

猜你喜欢

转载自blog.csdn.net/qq_41157876/article/details/111880541