🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
24.2 备忘录模式的定义 备忘录模式(Memento Pattern)提供了一种弥补真实世界缺陷的方法,让“后悔药”在程序的世界中真实可行,其定义如下: Without violating encapsulation,capture and externalize an object's internal state so that the object can be restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。) 通俗地说,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法,其通用类图如图24-4所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036986058.jpg) 图24-4 备忘录模式的通用类图 我们来看看类图中的三个角色。 ● Originator发起人角色 记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。 ● Memento备忘录角色 负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。 ● Caretaker备忘录管理员角色 对备忘录进行管理、保存和提供备忘录。 备忘录模式的通用代码也非常简单,我们先看发起人角色,如代码清单24-8所示。 代码清单24-8 发起人角色 public class Originator {      //内部状态      private String state = "";            public String getState() {              return state;      }      public void setState(String state) {              this.state = state;      }      //创建一个备忘录      public Memento createMemento(){              return new Memento(this.state);      }      //恢复一个备忘录      public void restoreMemento(Memento _memento){              this.setState(_memento.getState());      } } 我相信你心里此刻有很多疑问,比如状态是多个怎么办?需要有多份备份怎么办?如果你很着急的话,请看24.4节,但我建议你还是跟随我一步一步地走,我们再来看备忘录角色,如代码清单24-9所示。 代码清单24-9 备忘录角色 public class Memento {      //发起人的内部状态      private String state = "";      //构造函数传递参数      public Memento(String _state){              this.state = _state;      }      public String getState() {              return state;      }      public void setState(String state) {              this.state = state;      } } 这是一个简单的JavaBean,备忘录管理者也是一个简单的JavaBean,如代码清单24-10所示。 代码清单24-10 备忘录管理员角色 public class Caretaker {      //备忘录对象      private Memento memento;      public Memento getMemento() {              return memento;      }      public void setMemento(Memento memento) {              this.memento = memento;      } } 这3个主要角色都很简单,我们来看场景类如何调用,如代码清单24-11所示。 代码清单24-11 场景类 public class Client {      public static void main(String[] args) {              //定义出发起人              Originator originator = new Originator();              //定义出备忘录管理员              Caretaker caretaker = new Caretaker();              //创建一个备忘录              caretaker.setMemento(originator.createMemento());              //恢复一个备忘录              originator.restoreMemento(caretaker.getMemento());      } } 备忘录模式就是这么简单,真正使用备忘录模式的时候可比这复杂得多。