简单网站建设报价单,浚县网站建设,传媒公司取名,外贸网站建设原则23种计模式之 前言 #xff08;5#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、#xff08;11#xff09;策略模式、责任链模式、命令模式、中介者模…23种计模式之 前言 5单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、11策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 设计原则
21-Python与设计模式–备忘录模式
一、游戏进度保存
打过游戏的朋友一定知道大多数游戏都有保存进度的功能如果一局游戏下来忘保存了进度
那么下次只能从上次进度点开始重新打了。一般情况下保存进度是要存在可持久化存储器上
本例中先以保存在内存中来模拟实现该场景的情形。
以模拟一个战斗角色为例。首先创建游戏角色。
class GameCharacter():vitality 0attack 0defense 0def displayState(self):print Current Values:print Life:%d % self.vitalityprint Attack:%d % self.attackprint Defence:%d % self.defensedef initState(self,vitality,attack,defense):self.vitality vitalityself.attack attackself.defense defensedef saveState(self):return Memento(self.vitality, self.attack, self.defense)def recoverState(self, memento):self.vitality memento.vitalityself.attack memento.attackself.defense memento.defense
class FightCharactor(GameCharacter):def fight(self):self.vitality - random.randint(1,10)GameCharacter定义了基本的生命值、攻击值、防御值以及实现角色状态控制的方法 FightCharactor实现具体的“战斗”接口。为实现保存进度的细节还需要一个备忘录来保存进度。 class Memento:vitality 0attack 0defense 0def __init__(self, vitality, attack, defense):self.vitality vitalityself.attack attackself.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()打印如下 Current Values: Life:100 Attack:79 Defence:60 Current Values: Life:91 Attack:79 Defence:60 Current Values: Life:100 Attack:79 Defence:60 由生命值变化可知先保存状态值经过一轮打斗后生命值由100变为91
而后恢复状态值生命值又恢复成100。二、备忘录模式
备忘录模式定义如下在不破坏封装性的前提下捕获一个对象的内部状态并在该对象之外保存这个状态。
这样以后就可以将该对象恢复到原来保存的状态。在备忘录模式中如果要保存的状态多
可以创造一个备忘录管理者角色来管理备忘录。三、备忘录模式应用场景
1、需要保存和恢复数据的相关状态场景。如保存游戏状态的场景撤销场景如Ctrl-Z操作事务回滚的应用。一般情况下事务回滚有两种方式一是把从恢复点开始的操作都反向执行一遍二是直接恢复到恢复点的各种状态。两种方式各有优缺点要结合业务场景决定使用哪种模式
2、副本监控场景。备忘录可以当作一个临时的副本监控实现非实时和准实时的监控。