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

备忘录模式(Memento Pattern)

🧠 备忘录模式(Memento Pattern)

备忘录模式 是行为型设计模式之一。它通过将对象的状态存储在一个备忘录中,允许对象在不暴露其内部结构的情况下,保存和恢复自己的状态。该模式允许将对象的状态保存到备忘录中,以便稍后恢复。


🎯 为什么需要备忘录模式?

  1. 状态保存与恢复:在一些应用中,可能需要保存某个对象的某个时间点的状态,并能够在以后恢复到这个状态。例如:撤销操作、历史记录、撤回功能等。
  2. 解耦与封装:备忘录模式避免了直接暴露对象的内部状态,确保对象的状态和外部代码解耦。
  3. 简化复杂操作:通过将状态的保存和恢复交给备忘录,简化了对对象状态的操作。

优缺点分析

优点缺点
对象状态存储和恢复非常方便增加了额外的类和复杂性
可以撤销操作,保留历史记录需要更多内存来保存对象状态
不暴露对象的内部结构可能需要管理备忘录的生命周期

🧩 Python 示例:实现撤销功能

我们通过一个简单的文本编辑器示例来展示如何应用备忘录模式。文本编辑器支持撤销功能,即撤销之前的编辑操作。


🎯 1️⃣ 备忘录类(Memento)

备忘录类用于保存文本的状态。

class Memento:def __init__(self, state: str):self.state = state  # 存储文本的状态

🎯 2️⃣ 发起人类(Originator)

发起人类保存对象的当前状态,并能够创建备忘录以及恢复状态。

class TextEditor:def __init__(self):self.state = ""  # 初始文本状态为空def write(self, text: str):self.state += text  # 模拟文本编辑操作def get_state(self):return self.state  # 获取当前状态def set_state(self, state: str):self.state = state  # 恢复状态

🎯 3️⃣ 管理者类(Caretaker)

管理者负责保存和恢复备忘录,但它不操作备忘录的内容,只是保存和调用。

class History:def __init__(self):self.mementos = []  # 用于存储备忘录def add(self, memento: Memento):self.mementos.append(memento)  # 保存备忘录def undo(self):if self.mementos:return self.mementos.pop()  # 恢复最近的状态return None

🎯 4️⃣ 客户端代码(TextEditor使用示例)

# 创建发起人和管理者对象
editor = TextEditor()
history = History()# 写一些内容
editor.write("Hello ")
history.add(Memento(editor.get_state()))  # 保存状态editor.write("World!")
history.add(Memento(editor.get_state()))  # 保存状态print(f"当前文本: {editor.get_state()}")  # 输出当前文本# 撤销操作
memento = history.undo()
if memento:editor.set_state(memento.state)  # 恢复到上一个状态print(f"撤销后的文本: {editor.get_state()}")  # 输出撤销后的文本# 再次撤销操作
memento = history.undo()
if memento:editor.set_state(memento.state)  # 恢复到上一个状态print(f"再次撤销后的文本: {editor.get_state()}")  # 输出再次撤销后的文本

输出结果

当前文本: Hello World!
撤销后的文本: Hello 
再次撤销后的文本: 

🧭 类图(Mermaid)

生成备忘录
管理备忘录
使用历史对象
Memento
-state
+__init__(state: str)
TextEditor
-state
+write(text: str)
+get_state()
+set_state(state: str)
History
-mementos
+add(memento: Memento)
+undo()

🧭 流程图(Mermaid)

User Editor History Memento write("Hello ") create a snapshot save snapshot write("World!") create a snapshot save snapshot undo() pop() restore "Hello " undo() pop() restore "" User Editor History Memento

🧠 应用场景总结

场景示例
撤销操作文本编辑器、绘图软件、游戏中的回退功能
版本控制保存项目文件的多个版本
数据恢复电子表格应用中的历史记录
工作流管理需要恢复步骤的工作流程系统

总结口诀

备忘录模式
保存对象的状态,以便稍后恢复。
实现撤销、恢复功能,解耦了对象与其状态的存储。


如果你有任何问题,或希望用更复杂的例子(如带有多个状态的场景)来进行说明,请告诉我,我可以继续帮助你!

http://www.xdnf.cn/news/286705.html

相关文章:

  • 56.[前端开发-前端工程化]Day03-webpack构建工具
  • Windows11 VS code 安装 Cline 调用 Github MCP 配置过程坑点汇总
  • 深入探索 51 单片机:从入门到实践的全面指南
  • ctfshow——web入门361~368
  • 电脑怎么分屏操作?
  • Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测
  • N-Gram 模型
  • 慢sql处理流程和常见案例
  • Webug4.0靶场通关笔记16- 第20关文件上传(截断上传)
  • 数据结构——算法复杂度
  • 部署GM DC Monitor 一体化监控预警平台
  • Python 整理3种查看神经网络结构的方法
  • 3DGS-slam:splatam公式
  • 开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM(一)
  • Git 标签管理
  • 【STM32 学习笔记】GPIO输入与输出
  • Scrapy分布式爬虫实战:高效抓取的进阶之旅
  • 【NLP】30. 深入理解 In-Context Learning 的核心机制与策略
  • PrivKV: Key-Value Data Collection with Local Differential Privacy论文阅读
  • vue+element 导航 实现例子
  • HarmonyOS Device Connector(hdc)
  • linux 中inotify与inode的关系是什么?
  • PandasAI:对话式数据分析新时代
  • 实战设计模式之中介者模式
  • 基于Boost库、Jsoncpp、cppjieba、cpp-httplib等构建Boost搜索引擎
  • Lua 元表和元方法
  • 重名导致does not name a type
  • 青少年编程与数学 02-018 C++数据结构与算法 25课题、图像处理算法
  • 科学养生,开启健康生活新篇章
  • [machine learning] Transformer - Attention (四)