23种设计模式【Java】解析 -备忘录模式

备忘录模式

目的

在不违反封装的情况下获得对象的内部状态,在需要时可以将对象恢复到最初状态。

类图

角色

  • Originator: 原始对象,发起人。
  • Caretaker: 管理角色,负责保存好备忘录。
  • Menento: 备忘录,负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
    23种设计模式【Java】解析 -备忘录模式_第1张图片

实现

这个就像打游戏时的存档独档机制,或者说 Ctrl + Z。

备忘录

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

原始对象

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();
   }
}

管理角色

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 Client {
   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());
   }
}

优缺点

优点

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

缺点

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

使用场景

  1. 需要保存/恢复数据的相关状态场景。
  2. 提供一个可回滚的操作。

JDK中的使用

  • java.io.Serializable

你可能感兴趣的:(设计模式)