行为型设计模式-备忘录(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_state
和restore_state
方法来保存和恢复状态。Caretaker
类是负责人,负责保存备忘录对象。客户端代码演示了如何使用备忘录模式来保存和恢复对象的状态。
总结
备忘录模式通过备忘录对象来捕获和存储另一个对象的内部状态,使得这些状态可以在以后被恢复,而不必暴露对象的具体实现。这种模式在需要实现撤销操作、事务操作或者状态恢复的场景中非常有用。