备忘录模式

意图:

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

适用性:

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++实现的更多相关文章

  1. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  2. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  3. 备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  4. 21备忘录模式Memento

    一.什么是备忘录模式 Memento模式也叫备忘录模式,是行为模式之 一,它的作用是保存对象的内部状态,并在需要 的时候(undo/rollback)恢复对象以前的状态. 二.备忘录模式的应用场景 如 ...

  5. Java 设计模式系列(十八)备忘录模式(Memento)

    Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...

  6. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...

  7. 设计模式之备忘录模式(Memento)

    备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...

  8. c++ 行为型_备忘录模式(Memento)

    行为型_备忘录模式(Memento) 作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式. 解释: 其参与者包括 1.Memnto(备忘录,如下列Coun ...

  9. 23.备忘录模式(Memento Pattern)

    using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...

  10. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

随机推荐

  1. 07--c++类的构造函数详解

    c++类的构造函数详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特 ...

  2. 很实用的html meta标签实现页面跳转

    就算你是有很多年开发经验的web开发工程师,有着很多web开发经验,对于先进的web开发技术有着很深刻的研究,然而你却忽略了那些最最基础的东西!现在我来问你,你是否对html所有的标签都能熟练的使用呢 ...

  3. vue中引入json数据,不用本地请求

    1.我的项目结构,需要在Daily.vue中引入daily.js中的json数据 2.把json数据放入一个js文件中,用exports导出,vscode的json格式太严格了,很多数据,调了一个多小 ...

  4. pytorch实战(7)-----卷积神经网络

    一.卷积: 卷积在 pytorch 中有两种方式: [实际使用中基本都使用 nn.Conv2d() 这种形式] 一种是 torch.nn.Conv2d(), 一种是 torch.nn.function ...

  5. Java实验环境搭建

    1.JDK的下载一.JDK的下载及安装 (1).网站网址搜索http://www.oracle.com/technetwork/java,进入浏览页(2)找到Trials and Download 点 ...

  6. Codeforces Round #550 (Div. 3)E. Median String

    把字符串看作是26进制的数,从后往前翻译,那么就可以把两个串变成对应的26进制的数字,那么只要把两个数加起来除以二就得到中间的串对应的数了,同理再转化回来就行了.但是这样会有一个问题就是串的长度有2e ...

  7. 【例题4-2 uva489】Hangman Judge

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 水题. 中间就赢了算赢.(重复说,算错 [代码] #include <bits/stdc++.h> using name ...

  8. 【codeforces 798B】Mike and strings

    [题目链接]:http://codeforces.com/contest/798/problem/B [题意] 给你n个字符串; 每次操作,你可以把字符串的每个元素整体左移(最左边那个字符跑到最后面去 ...

  9. Spring MVC学习总结(2)——Spring MVC常用注解说明

        使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能. 02     之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使 ...

  10. 字体大小之px、em、rem、pt,字号详解

    PX px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. 是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Pe ...