【程序设计】Python的备忘录模式

备忘录模式定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

这样以后就可以将该对象恢复到原来保存的状态

在备忘录模式中,如果要保存的状态多,可以创造一个备忘录管理者角色来管理备忘录

应用场景
1、需要保存和恢复数据的相关状态场景。如保存游戏状态的场景;撤销场景,如Ctrl-Z操作;事务回滚的应用。一般情况下事务回滚有两种方式:一是把从恢复点开始的操作都反向执行一遍;二是直接恢复到恢复点的各种状态。两种方式各有优缺点,要结合业务场景,决定使用哪种模式;
2、副本监控场景。备忘录可以当作一个临时的副本监控,实现非实时和准实时的监控。


流程图:

【程序设计】Python的备忘录模式_第1张图片


python代码实现:

"""

Memento
备忘录模式

大多数游戏都有保存进度的功能
保存在内存中来模拟实现该场景的情形
"""

# 模拟一个战斗角色,创建游戏角色
import random


class GameCharacter():
    """GameCharacter定义了基本的生命值、攻击值、防御值以及实现角色状态控制的方法"""
    vitality = 0
    attack = 0
    defense = 0
    def displayState(self):
        print ('当前值:')
        print ('生命:%d' % self.vitality)
        print ('攻击:%d' % self.attack)
        print ('防御:%d' % self.defense)

    def initState(self,vitality,attack,defense):
        self.vitality = vitality
        self.attack = attack
        self.defense = defense
    def saveState(self):
        return Memento(self.vitality, self.attack, self.defense)
    def recoverState(self, memento):
        self.vitality = memento.vitality
        self.attack = memento.attack
        self.defense = memento.defense
class FightCharactor(GameCharacter):
    """FightCharactor实现具体的“战斗”接口。"""
    def fight(self):
        self.vitality -= random.randint(1,10)


# 备忘录,来保存进度
class Memento:
    vitality = 0
    attack = 0
    defense = 0
    def __init__(self, vitality, attack, defense):
        self.vitality = vitality
        self.attack = attack
        self.defense = defense


if __name__=="__main__":
    game_chrctr = FightCharactor()
    game_chrctr.initState(100,79,60)
    game_chrctr.displayState()
    
    memento = game_chrctr.saveState()
    
    game_chrctr.fight()
    game_chrctr.displayState()
    
    # 保存进度
    game_chrctr.recoverState(memento)
    
    game_chrctr.displayState()




原文:https://yq.aliyun.com/articles/71199?spm=a2c4e.11153940.blogcont280715.29.175692aawkXRdB

你可能感兴趣的:(Python,Language,程序人生,Python开发实战)