行为型设计模式-备忘录(memento)模式

设计模式汇总:查看

通俗示例

想象一下你正在玩一个角色扮演游戏,在游戏中你有一个角色,随着游戏的进行,角色的状态会不断变化,比如经验值、装备和生命值等。如果游戏中没有保存功能,一旦游戏意外关闭或者你想要重新尝试某个决策,你将不得不重新开始游戏。但是,如果游戏提供了保存功能,你可以随时创建一个"快照"来记录当前角色的状态,如果后续出现了不利的局面,你可以回到这个"快照"来恢复角色的状态。这里的"快照"就是备忘录模式中的备忘录对象,它帮助你保存和恢复游戏状态。

通俗解释

备忘录模式是一种行为型设计模式,它允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。备忘录模式主要包括三个角色:发起人(Originator)、备忘录(Memento)和负责人(Caretaker)。发起人对象负责创建一个备忘录对象来存储其当前状态,负责人对象则负责管理备忘录对象,包括保存和提供备忘录以便恢复状态。

备忘录模式的组成包括以下几部分:

  • 发起人(Originator):创建并在备忘录中存储状态。
  • 备忘录(Memento):存储发起人的内部状态,并且防止外部访问。
  • 负责人(Caretaker):负责保存备忘录对象,通常不关心备忘录的细节。

备忘录模式的优点

  • 保持封装性:发起人不需要暴露其内部状态细节,只需通过备忘录对象来保存和恢复状态。
  • 简化发起人角色:发起人不需要管理和维护历史状态,这些工作由备忘录和负责人来完成。
  • 灵活的状态恢复:可以恢复到任意保存的状态,提供了一种"撤销"或"重做"的操作。

Python代码示例

以下是一个备忘录模式的简单实现:

python 复制代码
# 备忘录类
class Memento:
    def __init__(self, state):
        self._state = state
    
    def get_state(self):
        return self._state

# 发起人类
class Originator:
    def __init__(self):
        self._state = None
    
    def set_state(self, state):
        self._state = state
    
    def save_state(self):
        return Memento(self._state)
    
    def restore_state(self, memento):
        self._state = memento.get_state()

# 负责人类
class Caretaker:
    def __init__(self):
        self._mementos = []
    
    def add_memento(self, memento):
        self._mementos.append(memento)
    
    def get_memento(self, index):
        return self._mementos[index]

# 客户端代码
if __name__ == "__main__":
    # 创建发起人和负责人
    originator = Originator()
    caretaker = Caretaker()
    
    # 设置发起人状态并保存
    originator.set_state("State #1")
    saved_state = originator.save_state()
    caretaker.add_memento(saved_state)
    
    # 更改发起人状态
    originator.set_state("State #2")
    
    # 恢复到之前保存的状态
    originator.restore_state(caretaker.get_memento(0))
    print(f"Restored state: {originator._state}")

在这个例子中,Memento类是备忘录,它有一个方法get_state来获取保存的状态。Originator类是发起人,它有save_state和restore_state方法来保存和恢复状态。Caretaker类是负责人,负责保存备忘录对象。客户端代码演示了如何使用备忘录模式来保存和恢复对象的状态。

总结

备忘录模式通过备忘录对象来捕获和存储另一个对象的内部状态,使得这些状态可以在以后被恢复,而不必暴露对象的具体实现。这种模式在需要实现撤销操作、事务操作或者状态恢复的场景中非常有用。

相关推荐
Zane199412 小时前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
Carl_奕然12 小时前
【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)
人工智能·设计模式·语言模型
小酒星小杜13 小时前
画 AI 漫画,别只会写“日漫风”:10 种画风、适用故事和可复制提示词
人工智能·设计模式·程序员
sarasuki1 天前
为什么 Agent 工具需要一个「协议」而不是「框架」:MCP 成为标准的底层逻辑
设计模式·agent·mcp
vivo互联网技术1 天前
知识不是文件,也不是向量 | KDC 系列 02
人工智能·设计模式·架构
Zane19947 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫8 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19948 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19949 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..9 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot