1、抽象备忘录(Memento):这是一个中立的接口,用于定义备忘录所需要实现的方法,抽象备忘录中包含了一个指向具体备忘录的引用,以及一个方法用于获取当前状态。
2、具体备忘录(ConcreteMemento):这是一个实现了抽象备忘录接口的具体类,用于存储对象的内部状态,具体备忘录可以根据需要选择不同的数据结构来存储状态信息。
3、抽象记忆者(Memory):这是一个中立的接口,用于定义记忆者所需要实现的方法,抽象记忆者中包含了一个指向具体记忆者的引用,以及一个方法用于获取、保存和删除备忘录。
4、具体记忆者(ConcreteMemory):这是一个实现了抽象记忆者接口的具体类,用于管理备忘录对象,具体记忆者可以根据需要选择不同的数据结构来存储备忘录对象。
备忘录模式的使用场景包括:
1、撤销操作:当用户执行一系列操作后,希望能够撤销其中的某个或多个操作,此时可以使用备忘录模式来保存操作的历史状态。
2、编辑器:在文本编辑器中,用户可能会频繁地修改文本内容,为了避免频繁地保存和加载文件,可以使用备忘录模式来保存用户的编辑状态。
3、游戏:在游戏中,玩家可能会经历多次失败后重新开始游戏,为了避免重复劳动,可以使用备忘录模式来保存玩家的游戏进度。
下面是一个简单的备忘录模式的Python实现:
from abc import ABC, abstractmethod 抽象备忘录 class Memento: def __init__(self, state): self._state = state @abstractmethod def getState(self): pass 具体备忘录A class ConcreteMementoA(Memento): def __init__(self, state): super().__init__(state) def getState(self): return self._state 具体备忘录B class ConcreteMementoB(Memento): def __init__(self, state): super().__init__(state) def getState(self): return self._state 抽象记忆者 class Originator: def __init__(self): self._mementos = [] def addMemento(self, memento): self._mementos.append(memento) def getAllMemories(self): return self._mementos def restore(self, index): if index < len(self._mementos): return self._mementos[index].getState() else: return None 具体记忆者C class Caretaker: _mementos = [] _originator = None @staticmethod def setOriginator(originator): Caretaker._originator = originator originator.addMemento = Caretaker.addMementoMethod originator.restore = Caretaker.restoreMethod originator.getAllMemories = Caretaker.getAllMemoriesMethod def addMementoMethod(memento): Caretaker._mementos.append(memento) def restoreMethod(index): if index < len(Caretaker._mementos): return Caretaker._mementos[index].getState() else: return None def getAllMemoriesMethod(): return Caretaker._mementos[:]
在使用备忘录模式时,首先创建一个具体的备忘录对象,然后将其添加到抽象记忆者中,当需要恢复到之前的状态时,可以从抽象记忆者中获取指定索引处的具体备忘录对象,并调用其getState方法来获取之前的状态。