设计模式--备忘录模式

  1. 备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,在以后的某个时间点可以恢复到之前保存的状态。

  2. 备忘录模式的UML图

    设计模式--备忘录模式_第1张图片

  3. Originator:原发器,负责创建一个备忘录,用来记录对象当前的状态,也可以用来恢复一个对象之前的某个状态。同时原发器还可以根据需要决定Memento存储Originator的那些内部状态。Memento备忘录,用来存储Originator的内部状态,并且可以防止Memento以外的对象访问Memento。在备忘录Memento中有两个接口,Caretaker只能看到备忘录中的窄接口,它只能将备忘录传递给其他对象。Originator可以看到宽接口,允许它访问返回到先前状态的所有数据。Caretaker:负责人,负责保存好备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

  4. 在备忘录模式中,最重要的就是Memento。备忘录除了原发器以外的对象都不可以访问。

  5. 备忘录模式的代码实现

    1. 创建一个原发器类(包含原发器类状态的保存和恢复)

      /**
       * 原发器类
       */
      public class Role {
      
          private int blood;
          private int magic;
      
          public Role(int blood, int magic) {
              this.blood = blood;
              this.magic = magic;
          }
      
          public int getBlood() {
              return blood;
          }
      
          public void setBlood(int blood) {
              this.blood = blood;
          }
      
          public int getMagic() {
              return magic;
          }
      
          public void setMagic(int magic) {
              this.magic = magic;
          }
      
          public void display(){
              System.out.println("当前状态,blood: " + this.blood +", magic: " + this.magic);
          }
      
          /**
           * 恢复备忘录
           */
          public void restoreMemento(RoleMemento roleMemento){
              this.blood = roleMemento.getBlood();
              this.magic = roleMemento.getMagic();
          }
      
          /**
           * 创建备忘录
           * @return
           */
          public RoleMemento createMemento(){
              return new RoleMemento(this.blood, this.magic);
          }
      }
      
    2. 创建一个备忘录类

      /**
       * 备忘录类
       */
      public class RoleMemento {
          private int blood;
          private int magic;
      
          public RoleMemento(int blood, int magic) {
              this.blood = blood;
              this.magic = magic;
          }
      
          public int getBlood() {
              return blood;
          }
      
          public void setBlood(int blood) {
              this.blood = blood;
          }
      
          public int getMagic() {
              return magic;
          }
      
          public void setMagic(int magic) {
              this.magic = magic;
          }
      }
      
    3. 创建一个负责人类

      /**
       * 负责人,传递备忘录并且能够保存备忘录,但是不能提供操作访问的方法
       */
      public class RoleCareTaker {
      
          private RoleMemento roleMemento;
      
          public RoleMemento getRoleMemento() {
              return roleMemento;
          }
      
          public void setRoleMemento(RoleMemento roleMemento) {
              this.roleMemento = roleMemento;
          }
      }
      
    4. 创建一个测试类

      public class Test {
          public static void main(String[] args) {
              Role role = new Role(100, 100);
              System.out.println("==========开始存档===========");
              role.display();
      
              RoleMemento memento = role.createMemento();
              RoleCareTaker roleCareTaker = new RoleCareTaker();
              //存储当前备忘录
              roleCareTaker.setRoleMemento(memento);
      
              //继续闯关,可能要恢复
              role.setBlood(0);
              role.setMagic(0);
              System.out.println("当前能量不足" );
              role.display();
      
              role.restoreMemento(roleCareTaker.getRoleMemento());
              System.out.println("===正在恢复能量====");
              role.display();
          }
      }
      
  6. 备忘录模式的优点

    1. 给用户提供了一种可以恢复历史状态的机制
    2. 实现信息的封装,不需要关心状态的保存细节
  7. 备忘录模式的缺点

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

  8. 备忘录模式的使用场景

    1. 需要保存一个对象在某个时刻的状态或部分状态
    2. 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态。
  9. JDK中对备忘录模式的使用

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H0cw0bIO-1578235473533)(C:\Users\Kangs\AppData\Roaming\Typora\typora-user-images\image-20200105224404396.png)]

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