行为型设计模式-备忘录(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_staterestore_state方法来保存和恢复状态。Caretaker类是负责人,负责保存备忘录对象。客户端代码演示了如何使用备忘录模式来保存和恢复对象的状态。

总结

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

相关推荐
晨米酱6 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机11 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机12 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机12 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机12 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤12 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴1 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式