lizema lizema
首页
  • js

    • js
  • Git相关

    • 《Git》
  • 设计模式

    • 设计模式
  • java
  • jdk
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • HTML
  • CSS
  • 学习方法
  • 敏捷开发心得
  • 心情杂货
  • 实用技巧
  • GPT相关
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

malize

各自努力,顶峰相见。
首页
  • js

    • js
  • Git相关

    • 《Git》
  • 设计模式

    • 设计模式
  • java
  • jdk
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • HTML
  • CSS
  • 学习方法
  • 敏捷开发心得
  • 心情杂货
  • 实用技巧
  • GPT相关
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 工作中用到的设计模式
  • 享元模式
  • 单例模式
  • 原型模式
  • 备忘录模式
    • 外观模式
    • 工厂方法模式
    • 模板方法模式
    • 策略模式
    • 装饰模式
    • 访问者模式
    • 责任链模式
    • 适配器模式
    • 中介者模式
    • 设计模式
    malize
    2020-11-18
    目录

    备忘录模式

    # 备忘录模式

    # 一、备忘录模式

    1. 原理:备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

    2. 优缺点

      1. 1 优点
      • 封装性:备忘录模式允许对象的状态封装在备忘录对象中,使得这些状态对外部对象不可见,从而保护了对象的封装性。
      • 状态恢复:备忘录模式提供了一种方便的机制,使得对象可以在需要时恢复到之前的某个状态,从而支持撤销操作或者回滚操作。
      • 简化了原发器类:备忘录模式将状态保存和恢复的逻辑从原发器中分离出来,使得原发器类的实现更加简洁,只需要关注自身的核心业务逻辑。
      • 多次撤销/回滚:备忘录模式允许保存多个备忘录对象,从而支持多次撤销或回滚操作,使得系统更加灵活。。
      1. 2 缺点
      • 资源消耗:如果需要保存的对象状态非常庞大,备忘录模式可能会消耗大量的内存资源。
      • 潜在的性能影响:备忘录模式可能会增加对象的处理时间,特别是在频繁保存和恢复状态的情况下,可能会对系统性能产生一定的影响。
      • 过多的备忘录对象:如果备忘录对象过多,可能会增加管理和维护的复杂性,特别是在需要支持多次撤销或回滚的情况下。
      • 破坏封装性:在某些情况下,备忘录模式可能会破坏对象的封装性,因为备忘录对象需要访问原发器的私有成员来保存和恢复状态。
    3. 适用场景

      • 撤销操作:当需要在应用中实现撤销操作时,备忘录模式是一个很好的选择。它允许你在需要时保存对象的状态,并能在之后将对象恢复到之前的状态,从而支持撤销操作。
      • 编辑器和文档管理器:在编辑器或文档管理器中,备忘录模式可以用于保存文档的历史状态。这样用户就可以随时撤销编辑操作或回到之前的版本。
      • 游戏状态管理:在游戏开发中,备忘录模式可以用于保存游戏状态,比如保存游戏进度或者回放游戏操作。
      • 事务管理:在数据库管理系统或事务处理系统中,备忘录模式可以用于事务的回滚和恢复,以确保数据的一致性和完整性。
      • 命令模式的补充:备忘录模式可以与命令模式结合使用,用于保存命令的历史状态,从而支持撤销和重做操作。
      • 配置管理:在系统配置管理中,备忘录模式可以用于保存配置的历史状态,以便在需要时进行恢复或回滚。

    # 二、备忘录模式基本代码

    1. 发起人类

      class Originator {
          private String state;
      
          // 设置状态
          public void setState(String state) {
              this.state = state;
              System.out.println("State set to: " + state);
          }
      
          // 获取状态
          public String getState() {
              return state;
          }
      
          // 创建备忘录
          public Memento saveStateToMemento() {
              return new Memento(state);
          }
      
          // 从备忘录恢复状态
          public void getStateFromMemento(Memento memento) {
              state = memento.getState();
          }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
    2. 备忘录类

       public static class Memento {
           private final String state;
      
           public Memento(String state) {
               this.state = state;
           }
      
           public String getState() {
               return state;
           }
       }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
    3. 管理备忘录类

      class Caretaker {
          private List<Originator.Memento> mementoList = new ArrayList<>();
      
          public void add(Originator.Memento state) {
              mementoList.add(state);
          }
      
          public Originator.Memento get(int index) {
              return mementoList.get(index);
          }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
    4. 客户端

      public class ConcreteIterator implements Iterator {
         public static void main(String[] args) {
              Originator originator = new Originator();
              Caretaker caretaker = new Caretaker();
      
              // 设置状态并保存到备忘录
              originator.setState("State #1");
              caretaker.add(originator.saveStateToMemento());
      
              originator.setState("State #2");
              caretaker.add(originator.saveStateToMemento());
      
              originator.setState("State #3");
              caretaker.add(originator.saveStateToMemento());
      
              // 恢复状态
              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());
              originator.getStateFromMemento(caretaker.get(2));
              System.out.println("Third saved State: " + originator.getState());
          }
      }
      
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26

    # 三、实现方式

    1. 创建备忘录(Memento)类,用于保存发起人对象的状态。
    2. 创建发起人(Originator)类,该类有保存状态、恢复状态的方法,以及一个用于创建备忘录对象的方法。
    3. 创建管理者(Caretaker)类,用于保存备忘录对象。
    4. 在客户端代码中,创建发起人对象并设置其状态,然后保存状态到备忘录对象中。
    5. 如果需要恢复状态,从管理者处获取备忘录对象,然后使用发起人对象恢复状态。
    编辑 (opens new window)
    #重学Java设计模式
    原型模式
    外观模式

    ← 原型模式 外观模式→

    最近更新
    01
    其他
    02
    其他
    03
    名人总结
    08-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式