#-*- coding:gbk -*-
#-*- coding:utf-8 -*-
"""
这是备忘录模式和装饰器模式的一个应用场景。
阿涛打完BOSS升级后觉得不满意,希望重新打一次。幸好打之前存过档,于是读档
后又打了一次BOSS,结果这一次被BOSS给打死了,无奈之下只好重新来过。
note:
1.备忘录模式能记录对象状态,在需要的时候恢复之,常用于新状态无效时将状态复原。
2.装饰器模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类
更灵活。
"""
import copy
#此函数返回一个备忘录复原函数,调用此复原函数可以复原状态。
def memento(obj, deep=False):
state = (copy.copy, copy.deepcopy)[bool(deep)](obj.__dict__)
def restore():
obj.__dict__.clear()
obj.__dict__.update(state)
return restore
#备忘录管理者,用于创建和使用备忘录
class MeManager(object):
deep = False
def __init__(self):pass
def save(self, *targets):
self.states = [memento(target, self.deep) for target in targets]
def rollback(self):
for st in self.states:
st()
#此类是一个修饰类,被此类修饰的函数在产生异常数据时会复原状态数据
class memo(object):
def __init__(self, method):
self.method = method
def __get__(self, obj):
def transaction(*args, **kwargs):
state = memento(obj)
try:
return self.method(*args, **kwargs)
except:
state()
raise
class GameRole(object):
def __init__(self, name):
self.name = name
self.hp = 100
self.mp = 100
self.level = 1
def upLevel(self):
self.level += 1
self.hp += 40
self.mp += 20
#角色死亡,复原角色状态,即复活之。
@memo
def dead(self):
self.hp = 0
raise
def __repr__(self):
return('角色 %s 等级为%d, 当前生命值为 %d, 当前精力值为 %d' % \
(self.name, self.level, self.hp, self.mp))
#Client
if __name__ == '__main__':
zhuoatao = GameRole('卓阿涛')
m = MeManager()
print('--打BOSSS前--')
print(zhuoatao)
m.save(zhuoatao)
zhuoatao.upLevel()
print('--打BOSS后--')
print(zhuoatao)
m.rollback()
print('--读档后回到解放前--')
print(zhuoatao)
try:
zhuoatao.dead()
except:
print('胜败乃兵家常事,大侠请重新来过。')
pass
print(zhuoatao)
设计模式之备忘录模式
最新推荐文章于 2024-04-24 18:24:21 发布