备忘录(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. redis有序集合性能 列表、集合、有序集合

    https://www.cnblogs.com/pirlo21/p/7120935.html 1.1 列表 列表(list)类型是用来存储多个字符串,元素从左到右组成一个有序的集合.列表中的每个字符串 ...

  2. linux中按照指定内容查找文件

    grep -rnRi 指定的内容 * | awk -F":" '{print $1}' 解释: grep 查找文件内容 -r 表示递归查找 -n 表示显示行号 -R 表示查找所有文 ...

  3. 写一致性原理以及quorum机制

    (1)consistency,one(primary shard),all(all shard),quorum(default)我们在发送任何一个增删改操作的时候,比如 PUT /index/type ...

  4. Spring JPA实现逻辑源码分析总结

    1.SharedEntityManagerCreator: entitymanager的创建入口 该类被EntityManagerBeanDefinitionRegistrarPostProcesso ...

  5. MapStruct

    一.Object mapping 的技术分类: 运行期 反射调用set/get 或者是直接对成员变量赋值 . 该方式通过invoke执行赋值,实现时一般会采用beanutil, Javassist等开 ...

  6. LeetCode-52.N-Queen II

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  7. ORACLE入门之Linux基础篇

    VIM0 这是数字『0 』:移动到这一行的最前面字符处$    移动到这一行的最后面字符处G    移动到这个档案的最后一行nG   n 为数字.移动到这个档案的第n 行.例如20G 则会移动到这个档 ...

  8. 使用jaxb根据xsd逆向生成java代码

    1.配置java环境变量,将java安装目录下bin文件夹下的xjc.exe配到classpath下 (一般有java环境变量就不用配置了) 2.进入xsd的文件夹下,cmd下执行 xjc -p 包路 ...

  9. PHP 操作 Redis 的手册

    转:https://www.cnblogs.com/jackluo/p/5708024.html String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思 ...

  10. 万恶之源 - Python生成器

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...