Java备忘录模式(优缺点应用场景与代码示例)

Java备忘录模式(优缺点应用场景与代码示例)-mikechen

备忘录模式经常用于数据回滚等恢复对象的场景,备忘录模式属于设计模式里的行为型模式,下面详解备忘录模式@mikechen

什么是备忘录模式

备忘录模式(Memento Pattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

一句话归纳,备忘录模式:就是保存对象的状态,在需要时进行恢复。

 

备忘录模式的应用场景

每个人都有犯错误的时候,都希望有种“后悔药”能弥补自己的过失,让自己重新开始。

在计算机应用中,客户同样会常常犯错误,能否提供“后悔药”给他们呢?

比如:

  • Eclipse 在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;
  • 还有在 Chrome浏览器中的后退键;
  • 数据库事务管理中的回滚操作等需要保存和恢复数据的相关状态场景;

这些操作都提供了当用户后悔时,能撤销当前操作的功能,这个功能就是“备忘录模式”。

备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。

 

备忘录模式的优缺点

优点:

  • 提供了一种可以恢复状态的机制,当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  • 实现了内部状态的封装,除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  • 简化了发起人类,发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

缺点:

  • 其主要缺点是:资源消耗大,如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。

 

备忘录模式的结构

Java备忘录模式(优缺点应用场景与代码示例)-mikechen

1.发起人(Originator)

记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

 

2.备忘录(Memento)

负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

 

3.管理者(Caretaker)

对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

 

备忘录模式的代码示例

1.定义发起人(Originator )

public class Originator {   
  private String state; 
  public Memento createMemento(){  
    return new Memento(state);  
  }  
  public void recover(Memento memento) {  
    this.state = memento.getState();  
  }  
}

 

2.定义备忘录(Memento)

// 备忘录
public class Memento {  
  public Memento(String state) {  
    this.setState(state);  
  }  
  private String state; 
  public String getState() {  
    return this.state;  
  }  
  public void setState(String state) {  
    this.state = state;  
  }  
}

 

3.定义管理者(Caretaker)

// 管理者
public class Caretaker {  
  private Memento memento;  
  public Memento getMemento() {  
    return this.memento;  
  }  
  public void setMemento(Memento memento) {  
    this.memento = memento;  
  }  
}

 

4.定义主函数

// 测试代码
public static void main(String[] args) {  
  Originator originator = new Originator();  
  originator.setState("1");  
  System.out.println(originator.toString());  
  Memento memento = originator.createMemento();  
  Caretaker caretaker = new Caretaker();  
  caretaker.setMemento(memento);  
  originator.setState("2");  
  System.out.println(originator.toString());  
  originator.recover(caretaker.getMemento());  
  System.out.println(originator.toString());  
}

 

备忘录模式的总结

备忘录模式有三个重要的角色:原发器(Originator)、备忘录(Memento)和管理者(Caretaker)。

备忘录模式主要用于需要备份和恢复的场景,例如游戏中的存档&读档功能,编辑器中的撤销&重做功能。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法