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

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

代码实现:

 // Memento.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <string>
#include<vector>
using namespace std; class Memento
{ public:
int m_vitality; //生命值
int m_attack; //进攻值
int m_defense; //防守值
Memento(int vitality,int attack,int defense):m_vitality(vitality),m_attack(attack),m_defense(defense) {}
Memento& operator=(const Memento &memento)
{
m_vitality = memento.m_vitality;
m_attack = memento.m_attack;
m_defense = memento.m_defense;
return *this;
}
}; class GameRole
{
private:
int m_vitality; //生命值
int m_attack; //进攻值
int m_defense; //防守值
public:
GameRole():m_vitality(),m_attack(),m_defense() {}
Memento Save()
{
Memento memento(m_vitality,m_attack,m_defense);
return memento;
}
void Load(Memento memento)
{
m_vitality = memento.m_vitality;
m_attack = memento.m_attack;
m_defense = memento.m_defense;
}
void show()
{
cout<<"vitality:"<<m_vitality<<",attack:"<<m_attack<<",defense"<<m_defense<<endl;
}
void Attack()
{
m_vitality -= ;
m_attack -= ;
m_defense -= ;
} }; class Caretake
{
public:
Caretake() {}
void Save(Memento memento){m_vecMemento.push_back(memento);}
Memento Load(int state) { return m_vecMemento[state]; }
private:
vector<Memento> m_vecMemento;
}; int _tmain(int argc, _TCHAR* argv[])
{
Caretake caretake;
GameRole role;
role.show(); //初始值
caretake.Save(role.Save()); //保存状态
role.Attack();
role.show(); //进攻后
role.Load(caretake.Load()); //载入状态
role.show(); //恢复到状态0
system("pause");
return ;
}

最新文章

  1. iOS---观察者模式之---&gt;KVO
  2. 如何在ASP.NET Core中实现一个基础的身份认证
  3. C# 解析 Json数据
  4. 深入JVM-垃圾收集器常用的GC参数
  5. https加密解密过程详解
  6. Unity开发 资源准备
  7. init/main.c
  8. MVC 安装
  9. HTML入门基础教程相关知识
  10. 小shell函数
  11. [TypeScript] Using Typings and Loading From node_modules
  12. (转)LINUX的端口和服务
  13. Linux中/etc/passwd文件与/etc/shadow文件解析.
  14. 开源Math.NET基础数学类库使用(06)数值分析之线性方程组直接求解
  15. C#常用8种排序算法实现以及原理简介
  16. PostgreSQL9.6.2的WINDOWS下安装
  17. leetcode 5 Longest Palindromic Substring--最长回文字符串
  18. 微信小程序-canvas绘制文字实现自动换行
  19. Chrome——F12 谷歌开发者工具详解
  20. 学习笔记之人工智能(Artificial Intelligence)

热门文章

  1. 005-ant design -结合echart
  2. hdu1199 线段树
  3. open-falcon设置报警邮件
  4. windows live writer backup
  5. 日志处理(二) 日志组件logback的介绍及配置使用方法(转)
  6. Java中com.jcraft.jsch.ChannelSftp讲解
  7. 【运维技术】kafka三实例集群环境搭建及测试使用
  8. NET Framework 4.0无法安装!
  9. HDU1160FatMouse&#39;s Speed
  10. 2017-2018-1 JaWorld 第六、七周作业