C++设计模式-备忘录模式
目录
基本概念
代码与实例
基本概念
备忘录(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++设计模式-备忘录模式相关推荐
- Python设计模式-备忘录模式
Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
- Java设计模式——备忘录模式
Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...
- 设计模式-备忘录模式(Memento)-Java
设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...
- C++设计模式——备忘录模式(memento pattern)
博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...
- java设计模式---备忘录模式
一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...
- 大话设计模式—备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保 ...
- PHP设计模式——备忘录模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...
- 一天一个设计模式---备忘录模式
介绍:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将对象恢复到原先保存的状态. 场景:我们在平时玩单机游戏的时候,比如红白机的Pokemon–宠物小精灵, ...
- golang设计模式——备忘录模式
备忘录模式 当初学备忘录模式的时候,特别开心.这不就是游戏里的备份嘛!游戏关闭之后,重新开启,从上次结束的位置继续开始.但终归没有进入游戏行业,也没有机会用过备忘录模式. 备忘录模式:在不破坏封装性的 ...
最新文章
- 北斗导航 | 卫星信号的跟踪与解调
- 【Android进阶学习】Http编程之HttpClient
- pytorch 正向与反向传播的过程 获取模型的梯度(gradient),并绘制梯度的直方图
- java 轮询请求接口_js调用轮询接口
- java注解 源码_详解Java注解教程及自定义注解
- cookie session token区别_cookie、session与token的真正区别
- 刚刚,史上最强Apollo3.5在CES发布!暗藏百度无人驾驶7大黑科技武器
- file watchers怎么默认打开_python怎么打印字符
- 多功能PCIE交换机之七:单NT到双NT
- 趣味思考--苹果剩余最大量
- 阿里云与SUSE共同畅聊云原生
- 转载:Rootkit总结
- win7高级搜索计算机,使用win7系统高级搜索功能的方法介绍
- 【精品,面试之前必读】【转贴】安氏大俗商业学(2005-8-28)
- 【转】四种主流温度传感器的优缺点比较
- 【GAMES101】作业3 Pipeline and Shading
- 大众点评 与 美团 与饿了么
- 超级计算机模拟生命起源,科学家研究发现,地球生命起源与远古碰撞有关,这是怎么回事?...
- OSChina 周六乱弹 ——你们怎么懂我的少年心
- Python风险价值计算投资组合VaR、期望损失ES
热门文章
- MySQL数据同步的一个很初级运用
- 分数诚可贵的飞鸽传书2012绿色版
- 她说她女儿(JAVASCRIPT小时的玩伴,也姓杨)
- 杨元庆:出身中国是联想吸引国际用户的障碍
- 面向对象技术第一讲 多态性
- Python作为人工智能的未来,已经超越Java高居首位
- cad小插件文字刷_小懒人CAD插件管理工具
- oracle中提取日期时间的特定部分,Extract()截取時間的特定部分
- python判断合法整数数字_C# 判断一字符串是否为合法数字(正则表达式)
- python多图合并成一张图_python使用PIL实现多张图片垂直合并