目录

基本概念

代码与实例


基本概念

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

结构图如下(此图来源于大话设计模式):

Originator为发起者

Memento为备忘录

Caretaker为管理者

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

代码与实例

如下程序运行截图如下:

源码如下:

Head.h

#ifndef HEAD_H
#define HEAD_H#include <iostream>
#include <string>
using namespace std;class Memento;//发起人 Originator 类
class Originator{public:const string &getState();void setState(const string &value);Memento *createMemento();void setMemento(Memento *m);void printCurrentState();Originator();~Originator();private:string state;Memento *memento;
};//备忘录 Memento 类
class Memento{public:Memento(const string &s);Memento(Memento *m);const Memento &operator=(Memento *copy);const string &getState();private:string state;
};//管理者 Caretaker类
class Caretaker{public:Caretaker();~Caretaker();Memento *getMemento();void setMemento(Memento *m);private:Memento *memento;
};#endif HEAD_H

Head.cpp

#include "Head.h"const std::string & Originator::getState()
{return state;
}void Originator::setState(const string &value)
{this->state = value;
}Memento * Originator::createMemento()
{if(memento != nullptr)delete memento;memento = new Memento(state);return memento;
}void Originator::setMemento(Memento *m)
{if(nullptr != memento)delete memento;memento = new Memento(m);this->state = memento->getState();
}void Originator::printCurrentState()
{cout << "当前的状态 : " << this->state << endl;
}Originator::Originator()
{memento = nullptr;
}Originator::~Originator()
{if(memento != nullptr)delete memento;
}Memento::Memento(const string &s)
{this->state = s;
}Memento::Memento(Memento *m)
{this->state = m->getState();
}const Memento &Memento::operator=(Memento *copy){this->state = copy->getState();return *this;
}const std::string & Memento::getState()
{return this->state;
}Caretaker::Caretaker()
{this->memento = nullptr;
}Caretaker::~Caretaker()
{if(memento != nullptr)delete memento;
}Memento * Caretaker::getMemento()
{return this->memento;
}void Caretaker::setMemento(Memento *m)
{if(this->memento != nullptr)delete memento;this->memento = new Memento(m);
}

Main.cpp

#include "Head.h"int main(int *argc, int *argv){//发起人的初始状态Originator *o = new Originator;o->setState("最开始的记录");o->printCurrentState();//保存其状态Caretaker *c = new Caretaker;c->setMemento(o->createMemento());cout << "管理者目前保存的状态 : " << c->getMemento()->getState() << endl;//改变发起人状态o->setState("我改变了");o->printCurrentState();//恢复o->setMemento(c->getMemento());o->printCurrentState();delete c;delete o;getchar();return 0;
}

C++设计模式-备忘录模式相关推荐

  1. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  2. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  3. Java设计模式——备忘录模式

    Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...

  4. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  5. C++设计模式——备忘录模式(memento pattern)

    博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...

  6. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  7. 大话设计模式—备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保 ...

  8. PHP设计模式——备忘录模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...

  9. 一天一个设计模式---备忘录模式

    介绍:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将对象恢复到原先保存的状态. 场景:我们在平时玩单机游戏的时候,比如红白机的Pokemon–宠物小精灵, ...

  10. golang设计模式——备忘录模式

    备忘录模式 当初学备忘录模式的时候,特别开心.这不就是游戏里的备份嘛!游戏关闭之后,重新开启,从上次结束的位置继续开始.但终归没有进入游戏行业,也没有机会用过备忘录模式. 备忘录模式:在不破坏封装性的 ...

最新文章

  1. 北斗导航 | 卫星信号的跟踪与解调
  2. 【Android进阶学习】Http编程之HttpClient
  3. pytorch 正向与反向传播的过程 获取模型的梯度(gradient),并绘制梯度的直方图
  4. java 轮询请求接口_js调用轮询接口
  5. java注解 源码_详解Java注解教程及自定义注解
  6. cookie session token区别_cookie、session与token的真正区别
  7. 刚刚,史上最强Apollo3.5在CES发布!暗藏百度无人驾驶7大黑科技武器
  8. file watchers怎么默认打开_python怎么打印字符
  9. 多功能PCIE交换机之七:单NT到双NT
  10. 趣味思考--苹果剩余最大量
  11. 阿里云与SUSE共同畅聊云原生
  12. 转载:Rootkit总结
  13. win7高级搜索计算机,使用win7系统高级搜索功能的方法介绍
  14. 【精品,面试之前必读】【转贴】安氏大俗商业学(2005-8-28)
  15. 【转】四种主流温度传感器的优缺点比较
  16. 【GAMES101】作业3 Pipeline and Shading
  17. 大众点评 与 美团 与饿了么
  18. 超级计算机模拟生命起源,科学家研究发现,地球生命起源与远古碰撞有关,这是怎么回事?...
  19. OSChina 周六乱弹 ——你们怎么懂我的少年心
  20. Python风险价值计算投资组合VaR、期望损失ES

热门文章

  1. MySQL数据同步的一个很初级运用
  2. 分数诚可贵的飞鸽传书2012绿色版
  3. 她说她女儿(JAVASCRIPT小时的玩伴,也姓杨)
  4. 杨元庆:出身中国是联想吸引国际用户的障碍
  5. 面向对象技术第一讲 多态性
  6. Python作为人工智能的未来,已经超越Java高居首位
  7. cad小插件文字刷_小懒人CAD插件管理工具
  8. oracle中提取日期时间的特定部分,Extract()截取時間的特定部分
  9. python判断合法整数数字_C# 判断一字符串是否为合法数字(正则表达式)
  10. python多图合并成一张图_python使用PIL实现多张图片垂直合并