当前位置: 首页 > news >正文

23种设计模式-行为型模式之备忘录模式(Java版本)

Java 备忘录模式(Memento Pattern)详解

🧠 什么是备忘录模式?

备忘录模式是一种行为型设计模式,它允许在不暴露对象实现细节的情况下,保存和恢复对象的状态。备忘录模式常常用于需要记录对象状态以便随时恢复的场景,如实现撤销操作、版本控制等。


🎯 使用场景

  • 需要保存对象的状态,以便以后恢复
  • 支持对象的撤销功能
  • 对象的状态改变需要被保存,且不希望暴露给外部

🏗️ 模式结构

  • Memento(备忘录):存储对象的内部状态,可以将状态保存在对象中
  • Originator(发起人):创建备忘录,保存当前的内部状态,并可以恢复到先前保存的状态
  • Caretaker(看护者):负责保存备忘录,但不能修改备忘录的内容,仅能调用恢复功能

✅ 示例:编辑器撤销操作

备忘录类

public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}

发起人类

public class Editor {private String content;public void setContent(String content) {this.content = content;}public String getContent() {return content;}public Memento saveState() {return new Memento(content);}public void restoreState(Memento memento) {this.content = memento.getState();}
}

看护者类

import java.util.ArrayList;
import java.util.List;public class Caretaker {private List<Memento> mementoList = new ArrayList<>();public void addMemento(Memento memento) {mementoList.add(memento);}public Memento getMemento(int index) {return mementoList.get(index);}
}

客户端

public class Client {public static void main(String[] args) {Editor editor = new Editor();Caretaker caretaker = new Caretaker();editor.setContent("Hello");caretaker.addMemento(editor.saveState());  // 保存当前状态editor.setContent("Hello, World!");caretaker.addMemento(editor.saveState());  // 保存新状态System.out.println("Current Content: " + editor.getContent());  // 输出:Hello, World!editor.restoreState(caretaker.getMemento(0));  // 恢复到旧状态System.out.println("Restored Content: " + editor.getContent());  // 输出:Hello}
}

✅ 优点

  • 可以保存和恢复对象的状态,支持撤销操作
  • 发起人对象不需要暴露其内部实现细节
  • 备忘录对象是只读的,不可以修改,有助于封装状态

⚠️ 缺点

  • 如果备忘录保存了过多的状态,可能会占用大量内存
  • 增加了类的数量,导致系统复杂度增加

🧩 使用建议

备忘录模式适合需要记录对象状态并支持恢复功能的场景,如文本编辑器的撤销操作、游戏的存档功能等。

相关文章:

  • Golang | 倒排索引Value的设计
  • 2 商户查询缓存
  • 02 业务流程架构
  • 第7章 内部类与异常类
  • Redis高可用架构全解析:主从复制、哨兵模式与集群实战指南
  • 基于STM32、HAL库的ADS1220IRVAR模数转换器ADC驱动程序设计
  • 初中级前端面试全攻略:自我介绍模板、项目讲解套路与常见问答
  • 30-算法打卡-字符串-重复的子字符串-leetcode(459)-第三十天
  • C++学习:六个月从基础到就业——模板编程:类模板
  • NCCL非阻塞non-blocking实现
  • 给函数参数设置默认值的方式
  • 【密码学——基础理论与应用】李子臣编著 第八章 SM2公钥密码算法 课后习题
  • 坐标转换:从WGS-84到国内坐标系(GCJ-02BD-09)
  • Android 系统的兼容性测试 - CTS Verifier、GTS、VTS、STS 等
  • BG开发者日志0427:故事的起点
  • 组件的基本知识
  • 0基础 | Proteus | 中断 | 点阵
  • 移除生产环境所有console.log
  • Unity:Sprite Shapes(精灵形状)
  • 4.27算法题
  • 药明康德一季度净利增长89%,在手订单增超四成至523亿元
  • 连演三场,歌剧《义勇军进行曲》在上海西岸大剧院上演
  • 中国海警局新闻发言人就菲律宾非法登临铁线礁发表谈话
  • 宣称防老年痴呆的“原装进口”保健品McPee被指涉假,未获澳方销售批准
  • 南阳市委原书记朱是西被“双开”:搞劳民伤财的“政绩工程”
  • 俄罗斯称已收复库尔斯克州,普京发表讲话