备忘录(Memento)模式可在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象外保存这个状态,如此之后就可将该对象恢复到原先保存的状态。
UML类图:
- Originator(起始者):负责创建一个Memento备忘录用以记录当前时刻之内部状态,Originator可根据需求來决定Memento要储存那些内部状态,以讓日後可使用备忘录來恢复内部状态。
- Memento(备忘录):负责储存Originator对象的内部状态,且要防止Originator以外的其它对象來访问Memento备忘录。
- Caretaker(管理者):负责保存好Memento备忘录,但不能对备忘录的内容进行操作或检查。
示例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'Nason'
class Originator(object): #起始者类
def __init__(self, state):
self.state = state
def get_memento(self):
return Memento(self.state)
def set_memento(self, memento):
self.state = memento.state
def show(self):
print "当前状态 ", self.state
class Memento(object): #备忘录类
def __init__(self, state):
self.state = state
class Caretaker(object): #管理者类
def __init__(self,memento):
self.memento = memento
if __name__ == "__main__":
# 初始状态
originator = Originator(state='On')
originator.show()
# 备忘录
caretaker = Caretaker(originator.get_memento())
# 修改状态
originator.state = 'Off'
originator.show()
# 复原状态
originator.set_memento(caretaker.memento)
originator.show()
輸出:
当前状态 On
当前状态 Off
当前状态 On
總結:
- 需要保存和回复数据的相关状态之场景,如保存游戏状态的场景:撤销场景,事务回滚等;
- 副本监控场景,备忘录可以当做一个临时的副本监控,实现非实时和准实时的监控。
优缺点分析
优点:
- 使用备忘录可把复杂的对象内部信息对其他的对象屏蔽起来。
缺点:
- 当需要保存的状态数据很大很多时,相对会消耗较多资源。