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

角色:

(1)Originator(发起人):创建盒子,恢复盒子。负责创建一个Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储Originator的哪些内部状态。

(2)Memento(备忘录):存储状态的盒子。负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,

他只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问先前状态所需的所有数据。

(3)Caretaker(管理者):将盒子封装。负责保存包备忘录Memento,不能对备忘录的内容进行操作或检查。

什么时候用?

Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到迁移状态。

 #include<iostream>
#include<string> class RoleStateMemento //状态存储箱
{
private:
int vit;
int atk;
int def;
public:
RoleStateMemento(int v, int a, int d)
{
vit = v; atk = a; def = d;
} int getVit(){ return vit; }
void setVit(int v){ vit = v; } int getAtk(){ return atk; }
void setAtk(int v){ atk = v; } int getDef(){ return def; }
void setDef(int v){ vit = v; } }; class GameRole
{
private:
int vit;
int atk;
int def; public:
int getVit(){ return vit; }
void setVit(int v){ this->vit = v; } int getAtk(){ return atk; }
void setAtk(int v){ this->atk = v; } int getDef(){ return def; }
void setDef(int v){ this->vit = v; } void GetInitState()
{
this->vit = ;this->atk = ;this->def = ;
}
void Fight()
{
this->vit = ; this->atk = ; this->def = ;
}
void StateDisplay()
{
std::cout << "当前角色状态:" << std::endl;
std::cout << "体力:" << this->vit << std::endl;
std::cout << "生命力:" << this->atk << std::endl;
std::cout << "防御力:" << this->def << std::endl << std::endl;
}
//“保存角色状态”方法,将游戏角色的三个状态值通过实例化“角色状态存储箱”返回
RoleStateMemento* SaveState()
{
return new RoleStateMemento(vit, atk, def);
}
//“恢复角色状态”方法,可将外部的“角色状态存储箱”中的状态值恢复给游戏角色
void RocoveryState(RoleStateMemento memento)
{
this->vit = memento.getVit();
this->atk = memento.getAtk();
this->def = memento.getDef();
} }; //Caretaker,管理者,管理的是存储箱子,封装save state 和 load state
class RoleStateCaretaker
{
private:
RoleStateMemento* memento;
public:
RoleStateCaretaker()
{
memento = NULL;
}
~RoleStateCaretaker()
{
if (memento != NULL)
{
delete memento;
memento = NULL;
}
}
RoleStateMemento* GetMemento()
{
return memento;
}
void SetMemento(RoleStateMemento* memento)
{
this->memento = memento;
} }; void main()
{
//大战Boss前
GameRole* lixiaoyao = new GameRole();
lixiaoyao->GetInitState();
lixiaoyao->StateDisplay(); //保存进度
RoleStateCaretaker* stateAdmin = new RoleStateCaretaker();
stateAdmin->SetMemento(lixiaoyao->SaveState()); //大战Boss时,损耗严重
lixiaoyao->Fight();
lixiaoyao->StateDisplay(); //恢复之前状态
lixiaoyao->RocoveryState(*stateAdmin->GetMemento());
lixiaoyao->StateDisplay(); delete lixiaoyao;
delete stateAdmin;
system("pause");
}

大话设计模式C++ 备忘录模式的更多相关文章

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

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

  2. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  3. 大话设计模式之模板模式 C#

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 今天一起探讨模板模式,如下: 一.概念 上一篇文章讲了大话设计模式:原型模式,原型模式主要是通过Clone()方法<深浅复制>,创建新的 ...

  4. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  5. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  6. C#设计模式:备忘录模式(Memento Pattern)

    一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...

  7. js设计模式——7.备忘录模式

    js设计模式——7.备忘录模式 /*js设计模式——备忘录模式*/ // 备忘类 class Memento { constructor(content) { this.content = conte ...

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

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

  9. java设计模式之备忘录模式

    备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.一听到备忘录这个字的时候想起了小小时打的游 ...

随机推荐

  1. 《Mysql DML语句》

    1:DISTINCT 用于去重,但是需要注意的是,它是用于所有列的,也就是说,除非指定的列全部相同,否则所有的行都会被检索出来. 2:ORDER BY 用于排序,但是应该注意的是,它因该是 SELEC ...

  2. 使用axios加入进度条

    思路:(安慰剂按钮)首先当触发按钮时,设置拦截器,启动进度条从0开始到100满(html进度条用数值value来控制,默认为0),设置进度条的配置函数然后在后端返回函数中启动停止精度条的函数,为了保持 ...

  3. python之文件操作的几种模式总结

    文件操作的几种模式: "w"                             #write ,清空写,生成一个新的文件,写入内容,覆盖原文件"w+"  ...

  4. TZOJ 5640: 数据结构实验:仓库管理

    描述 某百货公司仓库中有一批电视机,按其价格严格从低到高的次序,以链表(链表含头结点)的形式存储于计算机中,链表的每个结点表示同样价格的电视机台数.现在又有m台价格为x元的电视机准备入库,请将其加入到 ...

  5. shell分析日志常用指令合集

    数据分析对于网站运营人员是个非常重要的技能,日志分析是其中的一个.日志分析可以用专门的工具进行分析,也可以用原生的shell脚本执行,下面就随ytkah看看shell分析日志常用指令有哪些吧.(log ...

  6. mysql 5.7.12 新增 X plugin x 协议 详解

    mysql 5.7.12 新增 X plugin  x 协议 详解http://xiaozhong991.blog.51cto.com/2354914/1763792 x 协议  操作nosql数据库 ...

  7. 使用SQL Server 的CDC功能实现数据变更捕获

    USE t; GO --开启某个数据库的CDC功能 exec sys.sp_cdc_enable_db GO --is_cdc_enabled栏位为1代表开启CDC功能了 SELECT is_cdc_ ...

  8. MySQL group replication介绍

    “MySQL group replication” group replication是MySQL官方开发的一个开源插件,是实现MySQL高可用集群的一个工具.第一个GA版本正式发布于MySQL5.7 ...

  9. vue 本地静态图片路径写法

    在img标签中 <img src="../../assets/images/haibao/06-2@2x.png" class="" width=&quo ...

  10. C 语言boolean 值判断

    printf("%d\n", !0);       1           1 printf("%d\n", !0);     #include <std ...