当前位置: 首页 > news >正文

21-Python与设计模式--备忘录模式

21-Python与设计模式--备忘录模式

一、游戏进度保存

打过游戏的朋友一定知道,大多数游戏都有保存进度的功能,如果一局游戏下来,忘保存了进度,那么下次只能从上次进度点开始重新打了。一般情况下,保存进度是要存在可持久化存储器上,本例中先以保存在内存中来模拟实现该场景的情形。
以模拟一个战斗角色为例。首先,创建游戏角色。

复制代码
class GameCharacter():
    vitality = 0
    attack = 0
    defense = 0
    def displayState(self):
        print 'Current Values:'
        print 'Life:%d' % self.vitality
        print 'Attack:%d' % self.attack
        print 'Defence:%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):
    def fight(self):
        self.vitality -= random.randint(1,10)
复制代码

GameCharacter定义了基本的生命值、攻击值、防御值以及实现角色状态控制的方法,FightCharactor实现具体的“战斗”接口。为实现保存进度的细节,还需要一个备忘录,来保存进度。

复制代码
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()
复制代码

打印如下:
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。

二、备忘录模式

备忘录模式定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原来保存的状态。在备忘录模式中,如果要保存的状态多,可以创造一个备忘录管理者角色来管理备忘录。


f1.png

 

三、备忘录模式应用场景

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

posted on 2019-01-06 10:44 漫天飞雪世情难却 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/jokezl/p/10227327.html

相关文章:

  • mysql-connector-java 6版本的jdbc连接问题
  • Android FM模块学习之四源码解析(一)
  • 冲刺第四天 1.4 FRI
  • 有关java中static关键的重写问题
  • Tortoise SVN 创建分支与合并
  • Delphi 发送按键
  • Python - 默认参数的一次性求值
  • Internet TV 影音娱乐新生活
  • Linux 引导过程内幕
  • android service 学习(上)
  • Azure Redis Cache (4) 配置和管理Redis Cache
  • WPF VS Apollo
  • 开始忙碌
  • 常用CSS样式
  • [编]使用AutoCompleteExtender实现文本框自动匹配
  • 【翻译】babel对TC39装饰器草案的实现
  • 【知识碎片】第三方登录弹窗效果
  • ES2017异步函数现已正式可用
  • git 常用命令
  • Java Agent 学习笔记
  • JSONP原理
  • Mac转Windows的拯救指南
  • PHP 小技巧
  • Vue.js-Day01
  • 动态魔术使用DBMS_SQL
  • 复杂数据处理
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 实战|智能家居行业移动应用性能分析
  • 一个JAVA程序员成长之路分享
  • 一个项目push到多个远程Git仓库
  • 智能合约Solidity教程-事件和日志(一)
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1) caustics\
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (二)pulsar安装在独立的docker中,python测试
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .net Application的目录
  • .net framework4与其client profile版本的区别
  • .NET Remoting学习笔记(三)信道
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net经典笔试题
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @DataRedisTest测试redis从未如此丝滑
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • []指针
  • [16/N]论得趣
  • [AIGC] MySQL存储引擎详解