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

备忘录模式

目的

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

类图

角色
  • Originator: 原始对象,发起人。
  • Caretaker: 管理角色,负责保存好备忘录。
  • Menento: 备忘录,负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
    image.png

实现

这个就像打游戏时的存档独档机制,或者说 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值