备忘录模式(Memento Pattern)
🧠 备忘录模式(Memento Pattern)
备忘录模式 是行为型设计模式之一。它通过将对象的状态存储在一个备忘录中,允许对象在不暴露其内部结构的情况下,保存和恢复自己的状态。该模式允许将对象的状态保存到备忘录中,以便稍后恢复。
🎯 为什么需要备忘录模式?
- 状态保存与恢复:在一些应用中,可能需要保存某个对象的某个时间点的状态,并能够在以后恢复到这个状态。例如:撤销操作、历史记录、撤回功能等。
- 解耦与封装:备忘录模式避免了直接暴露对象的内部状态,确保对象的状态和外部代码解耦。
- 简化复杂操作:通过将状态的保存和恢复交给备忘录,简化了对对象状态的操作。
✅ 优缺点分析
✅ 优点 | ❌ 缺点 |
---|---|
对象状态存储和恢复非常方便 | 增加了额外的类和复杂性 |
可以撤销操作,保留历史记录 | 需要更多内存来保存对象状态 |
不暴露对象的内部结构 | 可能需要管理备忘录的生命周期 |
🧩 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)
🧭 流程图(Mermaid)
🧠 应用场景总结
场景 | 示例 |
---|---|
撤销操作 | 文本编辑器、绘图软件、游戏中的回退功能 |
版本控制 | 保存项目文件的多个版本 |
数据恢复 | 电子表格应用中的历史记录 |
工作流管理 | 需要恢复步骤的工作流程系统 |
✅ 总结口诀
备忘录模式:
✅ 保存对象的状态,以便稍后恢复。
✅ 实现撤销、恢复功能,解耦了对象与其状态的存储。
如果你有任何问题,或希望用更复杂的例子(如带有多个状态的场景)来进行说明,请告诉我,我可以继续帮助你!