设计模式之备忘录模式

#-*- 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)
            
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值