python-备忘录模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns
说明:
一个成熟的软件应当允许用户取消不确定的操作或者从错误的状态中恢复过来。复制,粘体,撤回,和剪切是常见的应用。因此程序必须提供必要的检查点和取消机制。在适当的事迹程序需要检查对象的状态,如有必要将状态信息保存到某处,以使得对象有机会恢复到它们之前的状态。但是面向对象的封装性又使得对象外部无法访问对象内部的状态,因此就可以使用备忘录模式。
备忘录模式定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原来保存的状态。在备忘录模式中,如果要保存的状态多,可以创造一个备忘录管理者角色来管理备忘录。
备忘录结构:
原发器,备忘录,负责人。
一个备忘录就是一个对象,它存储另一个对象某个瞬间的内部状态,被存储的对象成为原发器。所谓备忘录就是原发器在某个瞬间的快照。同一个原发器可以有多个快照。
实例:
打过游戏的朋友一定知道,大多数游戏都有保存进度的功能,如果一局游戏下来,忘保存了进度,那么下次只能从上次进度点开始重新打了。一般情况下,保存进度是要存在可持久化存储器上,本例中先以保存在内存中来模拟实现该场景的情形。
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.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:94
Attack:79
Defence:60
Current Values:
Life:100
Attack:79
Defence:60
可以看出,备忘录很好的保存了角色之前的状态,包括生命值,攻击值,防御值等。
优点:
提供了一种状态恢复的实现机制,方便用户。实现了对信息的封装,不违背面向对象的设计原则。
缺点:
很明显的看出,想要恢复状态就要引入一个备忘录对象,资源消耗巨大。
使用环境;
保存一个对象在某一个时刻的全部或者部分状态,需要实现撤销操作(ctrl+z)和事务回滚。
python-备忘录模式的更多相关文章
- 设计模式-行为型模式,python备忘录模式
备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...
- 大话设计模式Python实现-备忘录模式
备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...
- [Python设计模式] 第18章 游戏角色备份——备忘录模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用代码模拟以下场景,一个游戏角色有生命力,攻击力,防御力等数据,在打Bos ...
- python 设计模式之备忘录模式
1.为什么用备忘录模式 假设大战僵尸游戏共10关,越是往后关卡越难,越难就越是费时间费钱费精力. 开始大战僵尸,玩了好久好久终于玩到了第9关,真是不容易. 这个时候开始玩第9关了,哇,好难啊,真不幸, ...
- MementoPattern(备忘录模式)
/** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ pr ...
- C#设计模式-备忘录模式
访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...
- C#设计模式系列:备忘录模式(Memento)
1.备忘录模式简介 1.1>.定义 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 1.2>.使用频率 ...
- php实现设计模式之 备忘录模式
<?php /*备忘录模式:在不破坏封装的前提下,获取对象的内部状态,并且在对象外保存该状态.这样就可以将该对象恢复到保存之前的状态(行为模式) * * 发起人:记录当前时刻的内部状态,负责定义 ...
- java设计模式之备忘录模式
备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...
- 备忘录模式(Memento Pattern)
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原 ...
随机推荐
- 跟着刚哥学习Spring框架--Spring容器(二)
Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用. Bean是S ...
- 简单记录常用git 命令
声明:仅作笔记用 拉取远程代码 1.git pull 2.如果需要,输入账户名密码 将本地代码推送到远程 1.git push 2.如果需要,输入账户名密码 同步远程分支 1.git fetch 2. ...
- Linux巩固记录(8) Hbase shell 基本使用
继续前几篇内容,讲解hbase基本使用 1.进入hbase shell: hbase有很多种操作方式,比如shell,java客户端,webUI等,可以直接输入hbase进行提示 [root@mast ...
- vue教程2-02 vue防止花括号{{}}闪烁,v-text和v-html、v-cloak
vue教程2-02 vue防止花括号{{}}闪烁,v-text和v-html.v-cloak 一.v-text和v-html <span>{{msg}}</span> --& ...
- 集合框架_DAY17
1:五种数据结构: 数组:长度固定,有序,查找方便 链表:添加删除方便 栈:先进后出 队列:先进先出 树结构:完成排序动作 2:泛型(了解) (1)是一种把明确数据类型的工作推迟到创 ...
- JavaScript -- FileSystemObject
-----056-FileSystemObject.html----- <!DOCTYPE html> <html> <head> <meta http-eq ...
- TCP滑动窗口
TCP利用滑动窗口实现流量控制基本的数据单位不是数据段,而是字节 滑动窗口本质上是描述接受方(本地)的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据.如果发送方收到接受 ...
- 通过公钥远程登录sshd认证
一.root账号使用ssh-keygen 生成密匙 [root@vmware ~]# ssh-keygen Generating public/private rsa key pair. Enter ...
- Java配置分离之Spring远程配置
访问我的博客 前言 集群应用的配置文件如果写在项目的 resources 目录下面,当遇到需要修改某一个配置值时,需要将集群的所有应用的配置信息进行修改,并且将机密的配置信息比如数据库账号密码如果不进 ...
- Java 容器源码分析之HashMap多线程并发问题分析
并发问题的症状 多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多 ...