备忘录模式(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)住,并外部化,存储起来,从而可以在将来合适的时候把 ...
随机推荐
- Mysql分组求和&LIMIT
分组求和mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY na ...
- (转)基于Metronic的Bootstrap开发框架经验总结(2)--列表分页处理和插件JSTree的使用
http://www.cnblogs.com/wuhuacong/p/4759564.html 在上篇<基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理& ...
- scala类型系统:24) 理解 higher-kinded-type
首先我们从最基本的泛型来看: 现在我们对上面泛型中的类型参数再进一步,也是个泛型会如何呢? 可以看到,java中不支持类型参数也是泛型类型的情况,而scala支持.这是一个很重要的区别,scala在类 ...
- golang入门-defer
package main import "fmt" func main() { i := 5 tmap := make(map[string]int, 5) tmap[" ...
- kmp板子
kmp 容易理解板子 详情见知乎 算法思想 对模式串求PMT,但实际上nxt数组是PMT向前移动一位 nxt数组含义:记母串为m[],模式串为p[]; m[i]与p[j]比较失配,需要比较m[i]与p ...
- Scrapy处理200-300范围之外的响应代码
HttpErrorMiddleware 类scrapy.spidermiddlewares.httperror.HttpErrorMiddleware 过滤掉不成功(错误)的HTTP响应,以便蜘蛛不必 ...
- HDU1069 - Monkey and Banana【dp】
题目大意 给定箱子种类数量n,及对应长宽高,每个箱子数量无限,求其能叠起来的最大高度是多少(上面箱子的长宽严格小于下面箱子) 思路 首先由于每种箱子有无穷个,而不仅可以横着放,还可以竖着放,歪着放.. ...
- Java反射获取class对象的三种方式,反射创建对象的两种方式
Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...
- (10)Spring Boot修改端口号【从零开始学Spring Boot】
Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 常用配置: #### ...
- redis实现分页技术
声明:原博客在这里https://www.cnblogs.com/find-the-right-direction/p/8465011.html,谢谢哥们提供,尊重原创. 本人是在原有的springb ...