设计模式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

相关文章

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如