博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python-备忘录模式
阅读量:6096 次
发布时间:2019-06-20

本文共 2218 字,大约阅读时间需要 7 分钟。

源码地址:

说明:

一个成熟的软件应当允许用户取消不确定的操作或者从错误的状态中恢复过来。复制,粘体,撤回,和剪切是常见的应用。因此程序必须提供必要的检查点和取消机制。在适当的事迹程序需要检查对象的状态,如有必要将状态信息保存到某处,以使得对象有机会恢复到它们之前的状态。但是面向对象的封装性又使得对象外部无法访问对象内部的状态,因此就可以使用备忘录模式。

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

 

 

备忘录结构:

原发器,备忘录,负责人。

一个备忘录就是一个对象,它存储另一个对象某个瞬间的内部状态,被存储的对象成为原发器。所谓备忘录就是原发器在某个瞬间的快照。同一个原发器可以有多个快照。

实例:

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

import random#以模拟一个战斗角色为例。首先,创建游戏角色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.defenseclass 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:94
Attack:79
Defence:60
Current Values:
Life:100
Attack:79
Defence:60

可以看出,备忘录很好的保存了角色之前的状态,包括生命值,攻击值,防御值等。

优点:

提供了一种状态恢复的实现机制,方便用户。实现了对信息的封装,不违背面向对象的设计原则。

缺点:

很明显的看出,想要恢复状态就要引入一个备忘录对象,资源消耗巨大。

使用环境;

保存一个对象在某一个时刻的全部或者部分状态,需要实现撤销操作(ctrl+z)和事务回滚。

转载于:https://www.cnblogs.com/welan/p/9130417.html

你可能感兴趣的文章
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
JAVA数组的定义及用法
查看>>
充分利用HTML标签元素 – 简单的xtyle前端框架
查看>>
设计模式(十一):FACADE外观模式 -- 结构型模式
查看>>
iOS xcodebuile 自动编译打包ipa
查看>>