大话设计模式C++ 备忘录模式
备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。
角色:
(1)Originator(发起人):创建盒子,恢复盒子。负责创建一个Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储Originator的哪些内部状态。
(2)Memento(备忘录):存储状态的盒子。负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,
他只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问先前状态所需的所有数据。
(3)Caretaker(管理者):将盒子封装。负责保存包备忘录Memento,不能对备忘录的内容进行操作或检查。
什么时候用?
Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到迁移状态。
- #include<iostream>
- #include<string>
- class RoleStateMemento //状态存储箱
- {
- private:
- int vit;
- int atk;
- int def;
- public:
- RoleStateMemento(int v, int a, int d)
- {
- vit = v; atk = a; def = d;
- }
- int getVit(){ return vit; }
- void setVit(int v){ vit = v; }
- int getAtk(){ return atk; }
- void setAtk(int v){ atk = v; }
- int getDef(){ return def; }
- void setDef(int v){ vit = v; }
- };
- class GameRole
- {
- private:
- int vit;
- int atk;
- int def;
- public:
- int getVit(){ return vit; }
- void setVit(int v){ this->vit = v; }
- int getAtk(){ return atk; }
- void setAtk(int v){ this->atk = v; }
- int getDef(){ return def; }
- void setDef(int v){ this->vit = v; }
- void GetInitState()
- {
- this->vit = ;this->atk = ;this->def = ;
- }
- void Fight()
- {
- this->vit = ; this->atk = ; this->def = ;
- }
- void StateDisplay()
- {
- std::cout << "当前角色状态:" << std::endl;
- std::cout << "体力:" << this->vit << std::endl;
- std::cout << "生命力:" << this->atk << std::endl;
- std::cout << "防御力:" << this->def << std::endl << std::endl;
- }
- //“保存角色状态”方法,将游戏角色的三个状态值通过实例化“角色状态存储箱”返回
- RoleStateMemento* SaveState()
- {
- return new RoleStateMemento(vit, atk, def);
- }
- //“恢复角色状态”方法,可将外部的“角色状态存储箱”中的状态值恢复给游戏角色
- void RocoveryState(RoleStateMemento memento)
- {
- this->vit = memento.getVit();
- this->atk = memento.getAtk();
- this->def = memento.getDef();
- }
- };
- //Caretaker,管理者,管理的是存储箱子,封装save state 和 load state
- class RoleStateCaretaker
- {
- private:
- RoleStateMemento* memento;
- public:
- RoleStateCaretaker()
- {
- memento = NULL;
- }
- ~RoleStateCaretaker()
- {
- if (memento != NULL)
- {
- delete memento;
- memento = NULL;
- }
- }
- RoleStateMemento* GetMemento()
- {
- return memento;
- }
- void SetMemento(RoleStateMemento* memento)
- {
- this->memento = memento;
- }
- };
- void main()
- {
- //大战Boss前
- GameRole* lixiaoyao = new GameRole();
- lixiaoyao->GetInitState();
- lixiaoyao->StateDisplay();
- //保存进度
- RoleStateCaretaker* stateAdmin = new RoleStateCaretaker();
- stateAdmin->SetMemento(lixiaoyao->SaveState());
- //大战Boss时,损耗严重
- lixiaoyao->Fight();
- lixiaoyao->StateDisplay();
- //恢复之前状态
- lixiaoyao->RocoveryState(*stateAdmin->GetMemento());
- lixiaoyao->StateDisplay();
- delete lixiaoyao;
- delete stateAdmin;
- system("pause");
- }
大话设计模式C++ 备忘录模式的更多相关文章
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- 大话设计模式之模板模式 C#
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 今天一起探讨模板模式,如下: 一.概念 上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法<深浅复制>,创建新的 ...
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone
C# Json反序列化 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...
- C#设计模式:备忘录模式(Memento Pattern)
一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...
- js设计模式——7.备忘录模式
js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...
- 设计模式之备忘录模式(Memento)
备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...
- java设计模式之备忘录模式
备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...
随机推荐
- [cloud][ovs][sdn] 安装 openvswitch-dpdk
[cloud][OVS][sdn] Open vSwitch 初步了解 继之前的内容,安装基于dpdk的ovs https://docs.openvswitch.org/en/latest/intro ...
- pyhton读取 excel表格文件
2019的第一天,忘记昨日之事,迎接新的明天. excel表格文件办公中常用,如通过Python操作这些数据需导入并有序读取这些数据 特随笔,供以后查阅 代码如下: import xlrd # fil ...
- js 正则判断字符串下划线的长度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 继承数组的slice方法
<script> var arr=[1,2,3,4,5]; console.log(Array.prototype.slice.call(arr,1)); </script> ...
- 【托业】【新托业TOEIC新题型真题】学习笔记12-题库八-P7
155.political figure 政治人物 prominent 160.association n.协会,社团; 联合,联系; 联想; rarely adv.很少地; 罕有地; 极精彩地; 珍 ...
- 测试:fiddler使用
Fiddler是个很强大的工具,很多新人可能不知道怎么用. 直接下载安装,然后打开电脑端的Fiddler,点击Tools > Fiddler Options,勾选上 Allow remote c ...
- python-面向对象-14_eval函数
eval 函数 eval() 函数十分强大 —— 将字符串 当成 有效的表达式 来求值 并 返回计算结果 # 基本的数学计算 In [1]: eval("1 + 1") Out[1 ...
- CentOS+Uwsgi+Nginx发布Flask开发的WebAPI
1.WebAPI 开发工具VS 于Windows环境中开发完成后使用SFTP进行同步文件到Centos中使用 2.重点:WebAPI触发的方法是为了发送Celery异步调度任务 Celery框架使用涉 ...
- 【CART与GBDT】
一.CART(分类回归树) 1.思想: 一种采用基尼信息增益作为划分属性的二叉决策树.基尼指数越小,表示纯度越高. 2.回归: 每个节点都有一个预测值,预测值等于属于该节点的所有样例的 ...
- Windows平台Mysql表名变小写的解决过程
由于要弄某个项目的数据库设计文档,几百张表,如果弄在word文档里面一个个添加,效率比较低. 故分别使用了Mysql WorkBench(win版)和Powerdesigner 15来做这个设计文档. ...