备忘录模式(Memento)C++实现
备忘录模式
意图:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将改对象恢复到原先保存的状态。
适用性:
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;
}
结果:

这样客户端实现了保存状态和恢复到对应状态,而内部处理过程却不知道。
备忘录模式(Memento)C++实现的更多相关文章
- 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)
原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- 备忘录模式-Memento Pattern(Java实现)
备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...
- 21备忘录模式Memento
一.什么是备忘录模式 Memento模式也叫备忘录模式,是行为模式之 一,它的作用是保存对象的内部状态,并在需要 的时候(undo/rollback)恢复对象以前的状态. 二.备忘录模式的应用场景 如 ...
- Java 设计模式系列(十八)备忘录模式(Memento)
Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...
- 二十四种设计模式:备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...
- 设计模式之备忘录模式(Memento)
备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...
- c++ 行为型_备忘录模式(Memento)
行为型_备忘录模式(Memento) 作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式. 解释: 其参与者包括 1.Memnto(备忘录,如下列Coun ...
- 23.备忘录模式(Memento Pattern)
using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...
- [工作中的设计模式]备忘录模式memento
一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...
随机推荐
- excel 处理方法
//.方法一:采用OleDB读取EXCEL文件: //打开excel 返回指定表中的所有数据 public DataSet ExcelToDS(string Path) { string strCon ...
- Linux删除大于/小于固定大小的文件等
删除目录下大小为0的文件 rm -f 删除当前目录下面所有 test 文件夹下面的文件 find ./ -name "test" -type d -exec rm -rf {} ; ...
- NFS网络文件系统方案
1,关闭防火墙和selinuxiptables -Fsystemctl stop firewalldsystemctl disable firewalldsetenforce 0 服务器系统 名 ...
- dup、文件锁、库函数、函数调用(day07)
一.lseek()重新定位文件的读写位置. #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off ...
- Java核心技术读书笔记02
第四章 对象和类 类之间的关系 最常见的三种关系 依赖("uses-a") Order依赖Account类看信息 聚合("has-a") Order包含多个It ...
- Linux浅谈磁盘管理及案例
磁盘管理 MBR原理图 从该图可理解到为什么主分区只能是四个. 可以不分区,但为了统一管理,提高访问效率 设备不同,生成设备名称不同 管理分区命令: lsblk查看块设备 fdisk创建MBR分区 f ...
- Jquery-自定义表单验证
jQuery自定义表单验证
- 阿里云 LAMP 使用基础
产品亮点 1.基于阿里云CentOS7.2镜像 2.采用yum方式安装,软件安装均为默认目录,未作任何修改. 3.采用经典LAMP组合,拓展性强,资源丰富,解决方案较多 4.附带PhpMyadmin和 ...
- win7下qt+opencv的环境配置
博客http://blog.csdn.net/qiurisuixiang/article/details/8665278已经完整地介绍了整个环境配置.需要一步不差按原执行.需要说明的是,几个path的 ...
- floyd求最小环 模板
http://www.cnblogs.com/Yz81128/archive/2012/08/15/2640940.html 求最小环 floyd求最小环 2011-08-14 9:42 1 定义: ...