当前位置: 首页 > news >正文

设计模式C++实现(12)——备忘录模式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

   软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计 模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计 模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍备忘录模式的实现。

       备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态[DP]。举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。这就是备忘录模式。

        给出备忘录模式的UML图,以保存游戏的进度为例。

          Memento类定义了内部的状态,而Caretake类是一个保存进度的管理者,GameRole类是游戏角色类。可以看到GameRole的对象依赖于Memento对象,而与Caretake对象无关。下面给出一个简单的是实现。

[cpp] view plain copy print ?
  1. //需保存的信息  
  2. class Memento    
  3. {  
  4. public:  
  5.     int m_vitality; //生命值  
  6.     int m_attack;   //进攻值  
  7.     int m_defense;  //防守值  
  8. public:  
  9.     Memento(int vitality, int attack, int defense):   
  10.       m_vitality(vitality),m_attack(attack),m_defense(defense){}  
  11.     Memento& operator=(const Memento &memento)   
  12.     {  
  13.         m_vitality = memento.m_vitality;  
  14.         m_attack = memento.m_attack;  
  15.         m_defense = memento.m_defense;  
  16.         return *this;  
  17.     }  
  18. };  
  19. //游戏角色  
  20. class GameRole    
  21. {  
  22. private:  
  23.     int m_vitality;  
  24.     int m_attack;  
  25.     int m_defense;  
  26. public:  
  27.     GameRole(): m_vitality(100),m_attack(100),m_defense(100) {}  
  28.     Memento Save()  //保存进度,只与Memento对象交互,并不牵涉到Caretake  
  29.     {   
  30.         Memento memento(m_vitality, m_attack, m_defense);  
  31.         return memento;  
  32.     }  
  33.     void Load(Memento memento)  //载入进度,只与Memento对象交互,并不牵涉到Caretake  
  34.     {  
  35.         m_vitality = memento.m_vitality;  
  36.         m_attack = memento.m_attack;   
  37.         m_defense = memento.m_defense;  
  38.     }  
  39.     void Show() { cout<<"vitality : "<< m_vitality<<", attack : "<< m_attack<<", defense : "<< m_defense<<endl; }  
  40.     void Attack() { m_vitality -= 10; m_attack -= 10;  m_defense -= 10; }  
  41. };  
  42. //保存的进度库  
  43. class Caretake    
  44. {  
  45. public:  
  46.     Caretake() {}  
  47.     void Save(Memento menento) { m_vecMemento.push_back(menento); }  
  48.     Memento Load(int state) { return m_vecMemento[state]; }  
  49. private:  
  50.     vector<Memento> m_vecMemento;  
  51. };  

        客户使用方式:

[cpp] view plain copy print ?
  1. //测试案例  
  2. int main()  
  3. {     
  4.     Caretake caretake;  
  5.     GameRole role;   
  6.     role.Show();   //初始值  
  7.     caretake.Save(role.Save()); //保存状态  
  8.     role.Attack();     
  9.     role.Show();  //进攻后  
  10.     role.Load(caretake.Load(0)); //载入状态   
  11.     role.Show();  //恢复到状态0  
  12.     return 0;  

转载于:https://my.oschina.net/iamhere/blog/419287

相关文章:

  • itunes connect 沙盒帐号地区的问题导致无法进行充值
  • Spark streaming的执行流程
  • tpcc-mysql 系列一:安装使用
  • 一个动画 Label (走马观花)
  • 携程网瘫痪超8小时,可能故障原因分析
  • phpcms v9修改栏目描述的多行文本为编辑器方法
  • 黎活明给程序员的忠告(转)
  • C# 添加.DLL 出错的解决方法
  • HihoCoder第十周:后序遍历
  • NPM vs Bower 的区别
  • yii 10.16
  • Android开发模板------自己定义SimpleCursorAdapter的使用
  • 代码html
  • Php5.5新特性 Generators详解
  • js修改后没反应-看看是不是取的缓存
  • 「译」Node.js Streams 基础
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • quasar-framework cnodejs社区
  • Service Worker
  • Spring声明式事务管理之一:五大属性分析
  • Vim Clutch | 面向脚踏板编程……
  • 百度地图API标注+时间轴组件
  • 笨办法学C 练习34:动态数组
  • 从伪并行的 Python 多线程说起
  • 第十八天-企业应用架构模式-基本模式
  • 经典排序算法及其 Java 实现
  • 浅谈web中前端模板引擎的使用
  • 区块链共识机制优缺点对比都是什么
  • 使用 @font-face
  • 再次简单明了总结flex布局,一看就懂...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Python 3 新特性:类型注解
  • # 飞书APP集成平台-数字化落地
  • #Lua:Lua调用C++生成的DLL库
  • #微信小程序:微信小程序常见的配置传值
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (4)事件处理——(7)简单事件(Simple events)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • ***检测工具之RKHunter AIDE
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net程序集学习心得
  • .NET委托:一个关于C#的睡前故事
  • /proc/vmstat 详解
  • @JSONField或@JsonProperty注解使用
  • [ C++ ] 继承
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题