备忘录模式

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

示例

  玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原来的状态。这就是备忘录模式。

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

#include <iostream>
#include <vector>
using namespace std; //需保存的信息
class Memento
{
public:
int m_vitality; //生命值
int m_attack; //进攻值
int m_defense; //防守值
public:
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对象交互,并不牵涉到Caretake
{
Memento memento(m_vitality, m_attack, m_defense);
return memento;
}
void Load(Memento memento) //载入进度,只与Memento对象交互,并不牵涉到Caretake
{
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 menento) { m_vecMemento.push_back(menento); }
Memento Load(int state) { return m_vecMemento[state]; }
private:
vector<Memento> m_vecMemento;
}; //测试案例
int main()
{
Caretake caretake;
GameRole role;
role.Show(); //初始值
caretake.Save(role.Save()); //保存状态
role.Attack();
role.Show(); //进攻后
role.Load(caretake.Load()); //载入状态
role.Show(); //恢复到状态0
return ;
}

参考:http://blog.csdn.net/wuzhekai1985

最新文章

  1. Node聊天程序实例02:chat_server.js
  2. C#:IO
  3. Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)
  4. 【转】android onNewIntent()触发机制及注意事项
  5. 理解WebKit和Chromium: 调试Android系统上的Chromium
  6. (从终端看linux-1)linux tty pty pts 概念 区别
  7. apk 反编译记录
  8. (转载)javascript转自世纪流年blog
  9. java 加减乘除错误
  10. 使用SeekBar办Android调色板
  11. angular element()
  12. 关于swagger——WebApi一个controller中出现多个Get是出现错误的处理
  13. 使用@Valid和BindingResult验证请求参数的合法性并处理校验结果
  14. Mycat实现mysql主从复制(读写分离)
  15. mui之上拉刷新和mui-content结合解决ios上拉不回弹的bug
  16. 使用fabric2打包部署文件
  17. 16,EasyNetQ-群集支持
  18. Hibernate.编写xml文件无自动提示信息
  19. Cname与A记录(Address)区别
  20. [TJOI2014]Alice and Bob[拓扑排序+贪心]

热门文章

  1. R语言数据集合并、数据增减、不等长合并
  2. 错误代码: 1242 Subquery returns more than 1 row
  3. HTML5不允许写结束标记的元素
  4. Django学习-4-request获取数据
  5. maven项目转eclipse
  6. MyISAM和InnoDB索引实现区别
  7. myeclipse 打开jsp文件出错
  8. H5 EventSource 实现web页面推送功能demo
  9. 【BZOJ1095】捉迷藏(动态点分治)
  10. 【Luogu1879】玉米田(状态压缩,动态规划)