Malize's blog Malize's blog
首页
  • 设计模式

    • 设计模式总览
    • 工作中用到的设计模式
  • 并发编程

    • 死锁
  • 技术文档

    • Docker 核心命令大全
    • Markdown 使用教程
    • npm 常用命令
    • yaml 语言教程
    • Nodejs 递归读文件
  • 构造问答系统

    • 项目背景
    • 构建答疑机器人
    • 扩展知识范围
    • 优化提示词
    • 自动化评测
    • 优化 RAG 应用
  • 构建 Agent 系统

    • Agent 基础与工具调用
    • 规划与执行
    • 多 Agent 团队协作
    • Memory 积累经验
    • Skill 可复用流程
    • Qwen Code 实践
  • 交付上线

    • 走向生产环境
    • 模型蒸馏
    • 部署模型
    • 生产实践
    • 安全合规
  • 工具手册

    • OpenClaw 命令速查
  • 规范 & 实践

    • 代码规范
    • sharding-jdbc
    • CIM 半导体行业
    • HTML 常用 meta
    • CSS 技巧收藏
  • 微服务

    • feign原理
  • Git

    • Git 笔记总览
    • Git 使用手册
    • Git 修改分支名
    • 团队 Git 分支规范
  • GitHub & 博客

    • GitHub 高级搜索技巧
    • GitHub Actions 自动部署
    • 博客搭建 - 百度收录
  • 优质网站
  • 前端库推荐
  • 成长学习

    • 学习方法
    • 敏捷开发实战
    • 提示词工程
  • 生活

    • 实用技巧
    • 心情杂货
    • 梦境与灵感
  • 技术问题

    • 面试问题备忘
  • 索引

    • 分类
    • 标签
    • 按年归档
GitHub (opens new window)

Malize

持续学习,持续成长
首页
  • 设计模式

    • 设计模式总览
    • 工作中用到的设计模式
  • 并发编程

    • 死锁
  • 技术文档

    • Docker 核心命令大全
    • Markdown 使用教程
    • npm 常用命令
    • yaml 语言教程
    • Nodejs 递归读文件
  • 构造问答系统

    • 项目背景
    • 构建答疑机器人
    • 扩展知识范围
    • 优化提示词
    • 自动化评测
    • 优化 RAG 应用
  • 构建 Agent 系统

    • Agent 基础与工具调用
    • 规划与执行
    • 多 Agent 团队协作
    • Memory 积累经验
    • Skill 可复用流程
    • Qwen Code 实践
  • 交付上线

    • 走向生产环境
    • 模型蒸馏
    • 部署模型
    • 生产实践
    • 安全合规
  • 工具手册

    • OpenClaw 命令速查
  • 规范 & 实践

    • 代码规范
    • sharding-jdbc
    • CIM 半导体行业
    • HTML 常用 meta
    • CSS 技巧收藏
  • 微服务

    • feign原理
  • Git

    • Git 笔记总览
    • Git 使用手册
    • Git 修改分支名
    • 团队 Git 分支规范
  • GitHub & 博客

    • GitHub 高级搜索技巧
    • GitHub Actions 自动部署
    • 博客搭建 - 百度收录
  • 优质网站
  • 前端库推荐
  • 成长学习

    • 学习方法
    • 敏捷开发实战
    • 提示词工程
  • 生活

    • 实用技巧
    • 心情杂货
    • 梦境与灵感
  • 技术问题

    • 面试问题备忘
  • 索引

    • 分类
    • 标签
    • 按年归档
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
    feign原理
    07-15
    02
    团队Git分支管理、迭代发布、分批投产标准化规范
    07-15
    03
    面试问题备忘
    07-07
    更多文章>
    Theme by Vdoing | Copyright © 2023-2026 Malize | GitHub | 桂ICP备2024034950号 | 桂公网安备45142202000030
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式