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

2024-06-18 16:32

本文主要是介绍设计模式C++实现(6)——备忘录模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


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

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

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

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

[cpp]  view plain  copy
  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
  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;  
  13. }  












本文转自:

http://blog.csdn.net/wuzhekai1985/article/details/6672906#reply






这篇关于设计模式C++实现(6)——备忘录模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072517

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S