python 设计模式之备忘录模式
1.为什么用备忘录模式
假设大战僵尸游戏共10关,越是往后关卡越难,越难就越是费时间费钱费精力。
开始大战僵尸,玩了好久好久终于玩到了第9关,真是不容易。
这个时候开始玩第9关了,哇,好难啊,真不幸,输掉了。
好沮丧,只能从第一关再来一轮了。
要是第9关玩输了以后,直接再从第9关开始玩,而不是从头再来。那该多好呀,会省不少时间的。
那能不能把玩到第9关这个游戏进度给保存下来
能
用备忘录模式
2. 定义:
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
在备忘录模式中,如果要保存的状态多,可以创造一个备忘录管理者角色来管理备忘录
Normal
0
false
false
false
EN-US
ZH-TW
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
3.备忘录模式的优点
1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,
使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需
要的这些状态的版本。
3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
4.备忘录模式的缺点:
1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
2、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。
5.例子
import random class zombie:
goldCoin=0 #金币数量
sun=0 #阳光数量
teWuBean=0 #特务豌豆射手数量
goldenSunflower=0 #金属向日葵数量
icyIceCactus=0 #寒冰仙人掌数量 def disState(self):
print('zombie game current status is as below:')
print('goldCoin : {}'.format(self.goldCoin))
print('sun : {}'.format(self.sun))
print('teWuBean : {}'.format(self.teWuBean))
print('goldenSunflower : {}'.format(self.goldenSunflower))
print('icyIceCactus : {}'.format(self.icyIceCactus)) def initState(self,goldCoin,sun,teWuBean,goldenSunflower,icyIceCactus):
self.goldCoin=goldCoin
self.sun=sun
self.teWuBean=teWuBean
self.goldenSunflower=goldenSunflower
self.icyIceCactus=icyIceCactus def saveState(self):
return memo(self.goldCoin,self.sun,self.teWuBean,self.goldenSunflower,self.icyIceCactus) def recoverState(self,memo):
self.goldCoin=memo.goldCoin
self.sun=memo.sun
self.teWuBean=memo.teWuBean
self.goldenSunflower=memo.goldenSunflower
self.icyIceCactus=memo.icyIceCactus class fightState(zombie):
def fight(self):
self.goldCoin=random.randint(1000,100000)
self.sun=random.randint(1000,100000)
self.teWuBean=random.randint(1,10)
self.goldenSunflower=random.randint(1,10)
self.icyIceCactus=random.randint(1,10) class memo():
goldCoin=0
sun=0
teWuBean=0
goldenSunflower=0
icyIceCactus=0 def __init__(self,goldCoin,sun,teWuBean,goldenSunflower,icyIceCactus):
self.goldCoin=goldCoin
self.sun=sun
self.teWuBean=teWuBean
self.goldenSunflower=goldenSunflower
self.icyIceCactus=icyIceCactus if __name__ == "__main__":
curState=fightState()
curState.initState(10000,9000,10,10,10)
print('现在植物大战僵尸游戏第8关已通关,马上开始打第9关了,目前游戏参数值如下:')
curState.disState()
state8=curState.saveState()
curState.fight()
print('越是往后关卡越难,第9关打完了了,真是惨不忍睹,目前参数值如下:')
curState.disState()
print('完败呀,只能重打了,恢复到第8关通关的参数吧,恢复如下')
curState.recoverState(state8)
curState.disState()
print('恢复完了,再开始第9关吧')
运行结果如下:

6.涉及角色
1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。
参考
https://baike.baidu.com/item/%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F/1430849?fr=aladdin
https://www.cnblogs.com/qq_841161825/articles/10144601.html(例子参考)
https://baike.baidu.com/item/%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F/1430849?fr=aladdin
Normal
0
false
false
false
EN-US
ZH-TW
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
python 设计模式之备忘录模式的更多相关文章
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- Python设计模式之MVC模式
# -*- coding: utf-8 -*- # author:baoshan quotes = ('A man is not complete until he is married. Then ...
- C#设计模式:备忘录模式(Memento Pattern)
一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...
- js设计模式——7.备忘录模式
js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...
- python设计模式之模板模式
python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...
- python设计模式之状态模式
python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...
- python设计模式之解释器模式
python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
随机推荐
- ORA-28547: connection to server failed, probable Oracle Net admin error
现象 C:\Users\Administrator>sqlplus scott/tiger@192.168.1.11:1521/orcl SQL*Plus: Release 11.2.0.4.0 ...
- 戴尔 R730 服务器装 server 2016。
服务器里面原装系统是 centos 7 ,服务器快递过来时 我没用root账号,(主要是主管忘了这台服务器用户名密码了). 需要用的系统是 server 2016 我这边就按正常的装机流程装机. 1, ...
- “key_share”和"pre_shared_key" 的区别
越是基本的问题或者概念越是难解释或者讲清楚,论文写到现在真的好无助的样子 . 在LTS协议中牵扯到握手的认证和秘钥建立的时候,这连个概念经常混淆,TLS1.3版本协议为参照,区别这两个概念 1.概念的 ...
- java后端处理高并发
一个登陆页面可能会被很多账户同时登陆或者注册,那么我们就好处理这些并发,否则降低程序的使用率,甚至程序奔溃,下面一段代码处理程序的高并发效果不错. /** *@author xiaoxie *@dat ...
- Guava【google】
Guava 是什么? Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库.这个库是为了方便编码,并减少编码错误.这个库提供用于集合,缓存,支持原语,并发性,常见注解, ...
- JS知识体系【JQ】附加理论+视频地址铺助学习
理论部分:https://www.jianshu.com/p/e10792076c6e //不吃鱼的猫_8e95---简书平台 https://www.cnblogs.com/hongqin/p/5 ...
- tinymce + vue 富文本编辑
用texterea最多支持换行,如果文本信息想要更加丰富一些,比如增加格式样式,比如增加图片,textarea就爱莫能助了 在网上搜寻了一番,发现tinymce是比较方便好用的一款富文本编辑 http ...
- 十分钟掌握Pandas(上)——来自官网API
十分钟掌握Pandas(上)——来自官网API 其实不止10分钟,这么多,至少一天 一.numpy和pandas numpy是矩阵计算库,pandas是数据分析库,关于百度百科,有对pandas的介绍 ...
- 使用注解方式实现 AOP和IoC
使用注解方式实现AOP和IoC IOC和DI的注解 IOC: @Component:实现Bean组件的定义 @Repository:用于标注DAO类,功能与@Component作用相当 @Servic ...
- 简单聊聊TiDB中sql优化的一个规则---左连接消除(Left Out Join Elimination)
我们看看 TiDB 一段代码的实现 --- 左外连接(Left Out Join)的消除; select 的优化一般是这样的过程: 在逻辑执行计划的优化阶段, 会有很多关系代数的规则, 需要将逻辑执行 ...