设计模式-行为型模式,python备忘录模式
备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
介绍
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决:通过一个备忘录类专门存储对象状态。
关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。
应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。
优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。
注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。
#encoding=utf-8
#
#by panda
#备忘录模式 def printInfo(info):
print unicode(info, 'utf-8').encode('gbk') #Originator:游戏角色类
class GameCharacter():
vitality = 0 #生命力
attack = 0 #攻击力
defense = 0 #防御力 def DisplayState(self):
printInfo('角色当前状态')
printInfo('\t生命力:%d' % self.vitality)
printInfo('\t攻击力:%d' % self.attack)
printInfo('\t防御力:%d' % self.defense) def InitState(self):
self.vitality = 100
self.attack = 100
self.defense = 100 def Fight(self):
self.vitality = 0
self.attack = 0
self.defense = 0 #保存状态
def SaveState(self):
return RoleStateMemento(self.vitality, self.attack, self.defense) #恢复状态
def RecoveryState(self, memento):
self.vitality = memento.vitality
self.attack = memento.attack
self.defense = memento.defense #Memento:角色状态存储箱
class RoleStateMemento():
vitality = 0 #生命力
attack = 0 #攻击力
defense = 0 #防御力 def __init__(self, vitality, attack, defense):
self.vitality = vitality
self.attack = attack
self.defense = defense #Caretaker:角色状态管理者
class RoleStateCaretaker():
memento = None def clientUI():
printInfo('----大战Boss前----')
id1 = GameCharacter()
id1.InitState()
id1.DisplayState() printInfo('----保存进度----')
stateAdmin = RoleStateCaretaker()
stateAdmin.memento = id1.SaveState() printInfo('----大战boss,损耗严重----')
id1.Fight()
id1.DisplayState() printInfo('----恢复之前的状态----')
id1.RecoveryState(stateAdmin.memento)
id1.DisplayState()
return if __name__ == '__main__':
clientUI();
设计模式-行为型模式,python备忘录模式的更多相关文章
- C#设计模式学习笔记:(22)备忘录模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8176974.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十个模式--备 ...
- 设计模式之第17章-备忘录模式(Java实现)
设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...
- C#设计模式之二十二备忘录模式(Memeto Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就 ...
- C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...
- 设计模式20---设计模式之备忘录模式(Memento)(行为型)
1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...
- 我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
概述: 我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉. ...
- 行为型模式(十) 备忘录模式(Memento)
一.动机(Motivate) 我们看上图,一个对象肯定会有很多状态,这些状态肯定会相互转变而促进对象的发展,如果要想在某一时刻把当前对象回复到以前某一时刻的状态,这个情况用"备忘录模式&qu ...
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
[状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...
- Java设计模式(21)——行为模式之备忘录模式(Memento)
一.概述 概念 UML简图 角色 根据下图得到角色 备忘录角色(Memento).发起人角色(Originator).负责人角色(Caretaker) 二.实践 使用白箱实现,给出角色的代码: 发起人 ...
随机推荐
- Guests组里的用户和其它组里的用户相比,在系统权限上有什么不同?
系统的使用者主要分为:(以计算机管理员administrator 和普通用户User最为常用:一般个人电脑的话,不建议设置太多的用户,这样会影响系统的处理速度,增加许多的垃圾文件.) 1.Admini ...
- db2 查询表空间使用情况
1.SQL 查询(选择Schema为SYSPROC) SELECT SUBSTR(TABLESPACE_NAME,1,20) AS TBSPC_NAME, bigint(TOTAL_PAGES * P ...
- C++.Linux下redis编程:error while loading shared libraries: libhiredis.so.0.13
编译 sudo gcc -o sltest01 sltest01.c -L/usr/local/lib/ -lhiredis 运行 sudo ./sltest01 编译成功后运行报错信息: ./slt ...
- Revit API根据链接文件开洞
开洞信息数据: ]); ; ; ; ; ...
- 一起来给iOS 11找bug: 苹果还是乔布斯时代的细节控吗?
众所周知,前几天苹果在位于苹果公园的Steve Jobs剧院召开了一年一度的新品发布会,正式揭幕了全屏的iPhoneX, 随后又把iOS 11推送给了测试员(Beta Tester)(正式版将于几周后 ...
- linux修改目录为可读写
发布到linux上遇到的问题, 上传目录没有写入权限 新建目录 mkdir /guangkuo/html/portal/images/upload 改为可读写 chmod -R a+w /guangk ...
- JNI学习小结
Java中类型与C/C++中对应关系 Java中的类的对应 Sign签名, 用来识别对应各个方法. JDK下的javap.exe能输出签名.用法javap -s -p 完整类名 下面是 ...
- Wordpress无法连接Mysql8的问题
安装了mysql 8.0.11 之后本地可以登录,但是远程第三方工具无法连接,本地安装的Wordpress在初始化时也连接失败.防火墙已经放通的, 解决之道: 首先登陆到mysql命令行: mysql ...
- SQL Server 数据库基础笔记分享(上)
前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...
- ajax之async属性
Ajax请求中的async:false/true的作用 官方的解释是:http://api.jquery.com/jQuery.ajax/ async Boolean Default: true By ...