备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。数据库
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态。spa
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态,这样能够在之后将对象恢复到原先保存的状态。code
什么时候使用:不少时候咱们老是须要记录一个对象的内部状态,这样作的目的就是为了容许用户取消不肯定或者错误的操做,可以恢复到他原先的状态,使得他有"后悔药"可吃。对象
如何解决:经过一个备忘录类专门存储对象状态。blog
关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。游戏
应用实例: 一、后悔药。 二、打游戏时的存档。 三、Windows 里的 ctri + z。 四、IE 中的后退。 四、数据库的事务管理。事务
优势: 一、给用户提供了一种能够恢复状态的机制,可使用户可以比较方便地回到某个历史的状态。 二、实现了信息的封装,使得用户不须要关心状态的保存细节。内存
缺点:消耗资源。若是类的成员变量过多,势必会占用比较大的资源,并且每一次保存都会消耗必定的内存。utf-8
使用场景: 一、须要保存/恢复数据的相关状态场景。 二、提供一个可回滚的操做。资源
注意事项: 一、为了符合迪米特原则,还要增长一个管理备忘录的类。 二、为了节约内存,可以使用原型模式+备忘录模式。
#encoding=utf-8 # #by panda #备忘录模式 def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #Originator:游戏角色类 class GameCharacter(): vitality = 0 #生命力 attack = 0 #攻击力 defense = 0 #防护力 def DisplayState(self): printInfo('角色当前状态') printInfo('\t生命力:%d' % self.vitality) printInfo('\t攻击力:%d' % self.attack) printInfo('\t防护力:%d' % self.defense) def InitState(self): self.vitality = 100 self.attack = 100 self.defense = 100 def Fight(self): self.vitality = 0 self.attack = 0 self.defense = 0 #保存状态 def SaveState(self): return RoleStateMemento(self.vitality, self.attack, self.defense) #恢复状态 def RecoveryState(self, memento): self.vitality = memento.vitality self.attack = memento.attack self.defense = memento.defense #Memento:角色状态存储箱 class RoleStateMemento(): vitality = 0 #生命力 attack = 0 #攻击力 defense = 0 #防护力 def __init__(self, vitality, attack, defense): self.vitality = vitality self.attack = attack self.defense = defense #Caretaker:角色状态管理者 class RoleStateCaretaker(): memento = None def clientUI(): printInfo('----大战Boss前----') id1 = GameCharacter() id1.InitState() id1.DisplayState() printInfo('----保存进度----') stateAdmin = RoleStateCaretaker() stateAdmin.memento = id1.SaveState() printInfo('----大战boss,损耗严重----') id1.Fight() id1.DisplayState() printInfo('----恢复以前的状态----') id1.RecoveryState(stateAdmin.memento) id1.DisplayState() return if __name__ == '__main__': clientUI();