备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。

角色:

(1)Originator(发起人):创建盒子,恢复盒子。负责创建一个Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储Originator的哪些内部状态。

(2)Memento(备忘录):存储状态的盒子。负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,

他只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问先前状态所需的所有数据。

(3)Caretaker(管理者):将盒子封装。负责保存包备忘录Memento,不能对备忘录的内容进行操作或检查。

什么时候用?

Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到迁移状态。

  1. #include<iostream>
  2. #include<string>
  3.  
  4. class RoleStateMemento //状态存储箱
  5. {
  6. private:
  7. int vit;
  8. int atk;
  9. int def;
  10. public:
  11. RoleStateMemento(int v, int a, int d)
  12. {
  13. vit = v; atk = a; def = d;
  14. }
  15.  
  16. int getVit(){ return vit; }
  17. void setVit(int v){ vit = v; }
  18.  
  19. int getAtk(){ return atk; }
  20. void setAtk(int v){ atk = v; }
  21.  
  22. int getDef(){ return def; }
  23. void setDef(int v){ vit = v; }
  24.  
  25. };
  26.  
  27. class GameRole
  28. {
  29. private:
  30. int vit;
  31. int atk;
  32. int def;
  33.  
  34. public:
  35. int getVit(){ return vit; }
  36. void setVit(int v){ this->vit = v; }
  37.  
  38. int getAtk(){ return atk; }
  39. void setAtk(int v){ this->atk = v; }
  40.  
  41. int getDef(){ return def; }
  42. void setDef(int v){ this->vit = v; }
  43.  
  44. void GetInitState()
  45. {
  46. this->vit = ;this->atk = ;this->def = ;
  47. }
  48. void Fight()
  49. {
  50. this->vit = ; this->atk = ; this->def = ;
  51. }
  52. void StateDisplay()
  53. {
  54. std::cout << "当前角色状态:" << std::endl;
  55. std::cout << "体力:" << this->vit << std::endl;
  56. std::cout << "生命力:" << this->atk << std::endl;
  57. std::cout << "防御力:" << this->def << std::endl << std::endl;
  58. }
  59. //“保存角色状态”方法,将游戏角色的三个状态值通过实例化“角色状态存储箱”返回
  60. RoleStateMemento* SaveState()
  61. {
  62. return new RoleStateMemento(vit, atk, def);
  63. }
  64. //“恢复角色状态”方法,可将外部的“角色状态存储箱”中的状态值恢复给游戏角色
  65. void RocoveryState(RoleStateMemento memento)
  66. {
  67. this->vit = memento.getVit();
  68. this->atk = memento.getAtk();
  69. this->def = memento.getDef();
  70. }
  71.  
  72. };
  73.  
  74. //Caretaker,管理者,管理的是存储箱子,封装save state 和 load state
  75. class RoleStateCaretaker
  76. {
  77. private:
  78. RoleStateMemento* memento;
  79. public:
  80. RoleStateCaretaker()
  81. {
  82. memento = NULL;
  83. }
  84. ~RoleStateCaretaker()
  85. {
  86. if (memento != NULL)
  87. {
  88. delete memento;
  89. memento = NULL;
  90. }
  91. }
  92. RoleStateMemento* GetMemento()
  93. {
  94. return memento;
  95. }
  96. void SetMemento(RoleStateMemento* memento)
  97. {
  98. this->memento = memento;
  99. }
  100.  
  101. };
  102.  
  103. void main()
  104. {
  105. //大战Boss前
  106. GameRole* lixiaoyao = new GameRole();
  107. lixiaoyao->GetInitState();
  108. lixiaoyao->StateDisplay();
  109.  
  110. //保存进度
  111. RoleStateCaretaker* stateAdmin = new RoleStateCaretaker();
  112. stateAdmin->SetMemento(lixiaoyao->SaveState());
  113.  
  114. //大战Boss时,损耗严重
  115. lixiaoyao->Fight();
  116. lixiaoyao->StateDisplay();
  117.  
  118. //恢复之前状态
  119. lixiaoyao->RocoveryState(*stateAdmin->GetMemento());
  120. lixiaoyao->StateDisplay();
  121.  
  122. delete lixiaoyao;
  123. delete stateAdmin;
  124. system("pause");
  125. }

大话设计模式C++ 备忘录模式的更多相关文章

  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. 大话设计模式之模板模式 C#

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 今天一起探讨模板模式,如下: 一.概念 上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法<深浅复制>,创建新的 ...

  4. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  5. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

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

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

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

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

  8. 设计模式之备忘录模式(Memento)

    备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...

  9. java设计模式之备忘录模式

    备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...

随机推荐

  1. [cloud][ovs][sdn] 安装 openvswitch-dpdk

    [cloud][OVS][sdn] Open vSwitch 初步了解 继之前的内容,安装基于dpdk的ovs https://docs.openvswitch.org/en/latest/intro ...

  2. pyhton读取 excel表格文件

    2019的第一天,忘记昨日之事,迎接新的明天. excel表格文件办公中常用,如通过Python操作这些数据需导入并有序读取这些数据 特随笔,供以后查阅 代码如下: import xlrd # fil ...

  3. js 正则判断字符串下划线的长度

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 继承数组的slice方法

    <script> var arr=[1,2,3,4,5]; console.log(Array.prototype.slice.call(arr,1)); </script> ...

  5. 【托业】【新托业TOEIC新题型真题】学习笔记12-题库八-P7

    155.political figure 政治人物 prominent 160.association n.协会,社团; 联合,联系; 联想; rarely adv.很少地; 罕有地; 极精彩地; 珍 ...

  6. 测试:fiddler使用

    Fiddler是个很强大的工具,很多新人可能不知道怎么用. 直接下载安装,然后打开电脑端的Fiddler,点击Tools > Fiddler Options,勾选上 Allow remote c ...

  7. python-面向对象-14_eval函数

    eval 函数 eval() 函数十分强大 —— 将字符串 当成 有效的表达式 来求值 并 返回计算结果 # 基本的数学计算 In [1]: eval("1 + 1") Out[1 ...

  8. CentOS+Uwsgi+Nginx发布Flask开发的WebAPI

    1.WebAPI 开发工具VS 于Windows环境中开发完成后使用SFTP进行同步文件到Centos中使用 2.重点:WebAPI触发的方法是为了发送Celery异步调度任务 Celery框架使用涉 ...

  9. 【CART与GBDT】

    一.CART(分类回归树)    1.思想:     一种采用基尼信息增益作为划分属性的二叉决策树.基尼指数越小,表示纯度越高.  2.回归: 每个节点都有一个预测值,预测值等于属于该节点的所有样例的 ...

  10. Windows平台Mysql表名变小写的解决过程

    由于要弄某个项目的数据库设计文档,几百张表,如果弄在word文档里面一个个添加,效率比较低. 故分别使用了Mysql WorkBench(win版)和Powerdesigner 15来做这个设计文档. ...