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