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

Originator(发起者):记录当前的状态,负责创建和恢复备忘录

Memento(备忘录):负责存储发起者的状态,在需要的时候提供发起人需要的状态

Caretaker(管理者):管理备忘录

(这里我们以单角色、单状态、单备份来演示,思想是相同的,无非是存储数据结构上的区别)

备忘录角色,定义了存储状态的变量,可以根据实际需求定义对应的存储对象

  1. public class Memento {
  2. private String state;
  3. public String getState() {
  4. return state;
  5. }
  6. public void setState(String state) {
  7. this.state = state;
  8. }
  9. }

发起者角色,存储状态,并且可以创建备忘录和将状态恢复为备忘录的值

  1. public class Originator {
  2. private String state;
  3. public String getState() {
  4. return state;
  5. }
  6. public void setState(String state) {
  7. this.state = state;
  8. }
  9. public Memento createMemento() {
  10. Memento memento = new Memento();
  11. memento.setState(state);
  12. return memento;
  13. }
  14. public void restoreMemento(Memento memento) {
  15. this.state = memento.getState();
  16. }
  17. }

管理者角色,管理了备忘录

  1. public class Caretaker {
  2. private Memento memento;
  3. public Memento getMemento() {
  4. return memento;
  5. }
  6. public void setMemento(Memento memento) {
  7. this.memento = memento;
  8. }
  9. }

测试类

  1. public class Client {
  2. @Test
  3. public void test() {
  4. //设置初始状态
  5. Originator originator = new Originator();
  6. originator.setState("状态1");
  7. System.out.println("初始状态:" + originator.getState());
  8. //创建管理者
  9. Caretaker caretaker = new Caretaker();
  10. caretaker.setMemento(originator.createMemento());
  11. //更新状态
  12. originator.setState("状态2");
  13. System.out.println("跟新状态:" + originator.getState());
  14. //恢复状态
  15. originator.restoreMemento(caretaker.getMemento());
  16. System.out.println("恢复状态:" + originator.getState());
  17. }
  18. }

运行结果

  1. 初始状态:状态1
  2. 跟新状态:状态2
  3. 恢复状态:状态1

优点:

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

缺点:

  • 在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的,为了节约内存,可以配合原型模式使用

应用场景:

  • 游戏的存档
  • CTRL + Z 撤销
  • 浏览器的后退
  • 数据库的事务管理
  • … …

版权声明:本文为songjilong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/songjilong/p/12846761.html