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

设计模式汇总:查看

通俗示例

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

通俗解释

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

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

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

备忘录模式的优点

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

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

总结

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

你可能感兴趣的:(设计模式,设计模式)