备忘录模式

意图:

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

适用性:

1、必须保存一个对象在某一个时刻的部分状态,这样以后需要时它才能恢复到先前的状态。

2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

UML:

代码实现:实现保存游戏中英雄的不同状态,并能恢复到对应状态。

 #include <iostream>
#include "memento.h"
#include <string>
#include <time.h>
#include <map> using namespace std; class Memento{
public:
Memento(int hp=, int mp=, int atk=)
{
mHp = hp;
mMp = mp;
mAttack = atk;
} public:
int mHp;
int mMp;
int mAttack;
}; class Caretaker
{
public:
Memento* GetState(string key)
{
return mData[key];
}
void SetState(string key, Memento* pMemento)
{
mData[key] = pMemento;
}
~Caretaker()
{
auto it = mData.begin();
for(; it != mData.end(); it++)
{
if(mData.count("he") && it->second != nullptr)
{
delete it->second;
}
}
mData.clear();
} private:
map<string, Memento*> mData;
}; class Hero{
public:
Hero(int hp=, int mp=, int at=):mHp(hp), mMp(mp), mAttack(at), mCaretaker(new Caretaker){} void saveState(string key)
{
Memento* pMemento = new Memento(mHp, mMp, mAttack);
mCaretaker->SetState(key, pMemento);
} void resumeState(string key)
{
auto mmt = mCaretaker->GetState(key);
mHp = mmt->mHp;
mMp = mmt->mMp;
mAttack = mmt->mAttack;
} void battle()
{
mHp = rand()%;
mMp = rand()%;
mAttack = rand()%;
} void showState()
{
cout<<"血量:"<<mHp<<endl
<<"蓝量:"<<mMp<<endl
<<"攻击:"<<mAttack<<endl;
} private:
int mHp;
int mMp;
int mAttack;
Caretaker* mCaretaker;
}; void main()
{
srand((unsigned int) time(NULL)); Caretaker ctk;
Hero hero;
Memento mmt; cout<<"----战斗前-----"<<endl;
hero.showState();
cout<<endl;
hero.saveState("战斗前"); hero.battle();
cout<<"-----战斗1后-----"<<endl;
hero.showState();
cout<<endl;
hero.saveState("战斗1后"); hero.battle();
cout<<"-----战斗2后-----"<<endl;
hero.showState();
hero.saveState("战斗2后");
cout<<endl; hero.battle();
cout<<"-----战斗3后-----"<<endl;
hero.showState();
hero.saveState("战斗3后");
cout<<endl; hero.resumeState("战斗1后");
cout<<"-----恢复战斗1结果-----"<<endl;
hero.showState();
cout<<endl; hero.resumeState("战斗前");
cout<<"-----恢复战斗前-----"<<endl;
hero.showState();
cout<<endl; return;
}

结果:

这样客户端实现了保存状态和恢复到对应状态,而内部处理过程却不知道。  

最新文章

  1. OAF_文件系列8_实现OAF处理Excel的JXL包详解
  2. 【活动】写#听云#原创博文 赢取iPhone 6超级大奖
  3. Reapter控件的特殊使用:使用EVAL调取asp:Repeater里面绑定的值来进行判断 根据从数据库获取的数据进行判断 ,进而显示成想要的内容
  4. JQuery知识快览之二—事件
  5. 基于Qt的开源音乐播放器(CZPlayer)
  6. AE实现点击一个要素,并显示其属性
  7. 静态链表实现 (A-B)U(B-A)
  8. Ubuntu上将终端安装到右键上
  9. 拿到6个重磅offer的大神,超详细面试经验总结
  10. 安装rlwrap-0.37.tar.gz
  11. WinForm界面设计优化过程
  12. 模型压缩,模型减枝,tf.nn.zero_fraction,统计0的比例,等。
  13. 如何清除浮动(float)所带来的影响
  14. EnglishGame
  15. C++11之 std::atomic (不用锁实现线程互斥)
  16. [VC6] 小谈如何解决VC6.0 open崩溃的问题(已解决)(转)
  17. Hadoop源码阅读环境搭建(IDEA)
  18. 几行JavaScript代码搞定Iframe 自动适应
  19. day 12 列表字典 补充
  20. 阿里云 Ubuntu 14.04 安装mysql 5.6

热门文章

  1. (转)基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作
  2. H5-data属性的一个问题
  3. AdminLTE框架基础布局使用
  4. Js 删除前弹出确认框
  5. Tomcat Eclipse Debug出现异常
  6. Python 集合 day3
  7. Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
  8. STM32F103 rtthread工程构建
  9. Python Shell 中敲击方向键显示「^[[C^[[D」,原因是什么?如何修复?
  10. CF135E Weak Subsequence (计数问题)