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 设计模式之备忘录模式的更多相关文章

  1. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  2. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  3. Python设计模式之MVC模式

    # -*- coding: utf-8 -*- # author:baoshan quotes = ('A man is not complete until he is married. Then ...

  4. C#设计模式:备忘录模式(Memento Pattern)

    一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...

  5. js设计模式——7.备忘录模式

    js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...

  6. python设计模式之模板模式

    python设计模式之模板模式 编写优秀代码的一个要素是避免冗余.在面向对象编程中,方法和函数是我们用来避免编写冗余代码的重要工具. 现实中,我们没法始终写出100%通用的代码.许多算法都有一些(但并 ...

  7. python设计模式之状态模式

    python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...

  8. python设计模式之解释器模式

    python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...

  9. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

随机推荐

  1. pandas(四)

    合并  merge,concat,join pd.merge(df1,df2,on=‘列名’,how='') df1.join(df2,how='outer',on='') pd.concat([df ...

  2. c# 调试过程

  3. c# 属性成员

  4. php中long2ip和2iplong

    <?php $string=ip2long("127.0.0.1"); $ip=long2ip($string); echo $string; echo "< ...

  5. matlab(7) Regularized logistic regression : mapFeature(将feature增多) and costFunctionReg

    Regularized logistic regression : mapFeature(将feature增多) and costFunctionReg ex2_reg.m文件中的部分内容 %% == ...

  6. Oracle LOB 大对象处理

    LOB类型列主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据. 一.LOB数据类型分类 1.按存储数据的类型分: ①字符类型:   CLOB:存储大量 单字节 字符数据.   N ...

  7. 聊聊MVCC多版本并发控制

    一.介绍 MVCC只在RR和RC 2个隔离级别下才能工作.MySQL的大多数事务存储引擎实现的都不是简单的行级锁机制.基于提升并发性能的考虑,它们一般都同时实现了MVCC. 通俗的来讲,MVCC是行级 ...

  8. 【CCF CSP】 20171203 行车路线 Java(有问题)80分

    问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公 ...

  9. c语言二级指针的使用,malloc内存申请

    #include<stdio.h> #include<stdlib.h> void AllocateMemory(int **pGetMemory, int n) { int ...

  10. HttpReader

    头文件: #pragma once #include <afxinet.h> class CSF_HttpDataReader { public: CSF_HttpDataReader(v ...