备忘录模式(Memento Pattern)

🧠 备忘录模式(Memento Pattern)

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


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

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

优缺点分析

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

🧩 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


🧠 应用场景总结

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

总结口诀

备忘录模式

保存对象的状态 ,以便稍后恢复。

实现撤销、恢复功能,解耦了对象与其状态的存储。


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

相关推荐
YoseZang4 天前
【设计模式】GoF设计模式之备忘录模式(Memento Pattern)
设计模式·备忘录模式
01空间4 天前
设计模式简述(十七)备忘录模式
设计模式·备忘录模式
碎梦归途11 天前
23种设计模式-行为型模式之备忘录模式(Java版本)
java·jvm·设计模式·软考·备忘录模式·软件设计师·行为型模式
hope_wisdom15 天前
实战设计模式之备忘录模式
设计模式·系统架构·软件工程·备忘录模式·架构设计
tuodianke21 天前
记录待办事项的便签软件有没有推荐的?
笔记·职场发展·软件需求·备忘录模式
搞不懂语言的程序员22 天前
备忘录模式深度解析与实战案例
数据库·python·备忘录模式
wenbin_java25 天前
设计模式之备忘录模式:对象状态的可逆时光机
java·设计模式·备忘录模式
nlog3n1 个月前
Java备忘录模式详解
java·python·备忘录模式
飞翔中文网2 个月前
Java设计模式之备忘录模式
java·设计模式·备忘录模式