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

Originator 发起人: 负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。

Memento 备忘录: 负责储存Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Mementor。

Caretaker 管理者: 负责保存好备忘录Mementor,不能对备忘录的内容进行操作或检查。

Memento模式比较使用与功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一个小部分, Originator可以根据

保存的Mementor信息还原到前一状态。

实例:

originator.h originator.cpp

#ifndef ORIGINATOR_H
#define ORIGINATOR_H #include <string>
#include <iostream>
#include "memento.h"
using namespace std; class Originator
{
public:
Originator();
void changeState();
Memento* createMemento();
void setMemento(Memento *memento);
void show(); private:
string state; }; #endif // ORIGINATOR_H
#include "originator.h"

Originator::Originator()
{
this->state = "state_xxxx";
} void Originator::changeState()
{
state = "state_change";
} Memento* Originator::createMemento()
{
return (new Memento(state));
} void Originator::setMemento(Memento* memento)
{
state = memento->state;
} void Originator::show()
{
cout << "state: " << state << endl;
}

memento.h memento.cpp

#ifndef MEMENTO_H
#define MEMENTO_H #include <string>
#include <iostream>
using namespace std; class Memento
{
public:
Memento(string state);
string state; }; #endif // MEMENTO_H
#include "memento.h"

Memento::Memento(string state)
{
this->state = state;
}

caretaker.h caretaker.cpp

#ifndef CARETAKER_H
#define CARETAKER_H #include "memento.h" class Caretaker
{
public:
Caretaker();
Memento *memento;
}; #endif // CARETAKER_H
#include "caretaker.h"

Caretaker::Caretaker()
{
memento = NULL;
}

main.cpp

#include <iostream>
#include "originator.h"
#include "memento.h"
#include "caretaker.h"
using namespace std; int main()
{
cout << "Memento test!" << endl; Originator o;
o.show(); Caretaker c;
c.memento = o.createMemento(); o.changeState();
o.show(); o.setMemento(c.memento);
o.show(); return 0;
}

大话设计模式--备忘录 Memento -- C++实现实例的更多相关文章

  1. 大话设计模式--观察者模式 Observer -- C++ 实现实例

    大话设计模式--1.观察者模式: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的 观察者对象,使他们能够自动更新自己. 使用场合: 当一 ...

  2. 大话设计模式--适配器模式 Adapter -- C++实现实例

    1.适配器模式: 将一个类的接口转换为客户希望的另一个接口,使得原来由于接口不能一起工作的那些类一起工作. 适配器模式一般用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 适配器模式分 ...

  3. 深入浅出设计模式——备忘录模式(Memento Pattern)

    模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...

  4. 大话设计模式Python实现-备忘录模式

    备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...

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

    主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C ...

  6. 大话设计模式C++ 备忘录模式

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

  7. 设计模式(18)--Memento(备忘录模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...

  8. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

  9. C++设计模式 - 备忘录模式(Memento)

    状态变化模式 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?"状态变化"模式为这一问题提供了一种解决方案. 典型模式 Sta ...

随机推荐

  1. jQuery 遍历 - eq() 和siblings() 方法

    eq() 方法将匹配元素集缩减值指定 index 上的一个. 通过为 index 为 2 的 div 加入适当的类.将其变为蓝色: <!DOCTYPE html> <html> ...

  2. WPF的TextBox抛出InvalidOperationException异常:Cannot close undo unit because no opened unit exists.

    近期遇到一个问题.应用使用过程中突然崩溃,查看dump发现异常信息例如以下: UI dispatcher has encountered a problem: 无法关闭撤消单元.由于不存在已打开的单元 ...

  3. (二)spark算子 分为3大类

     transgormation的算子对key-value类型的数据有三种: (1)输入 与 输出为一对一关系 mapValue();针对key-value类型的数据并只对其中的value进行操作,不对 ...

  4. PHP - 获取音频长度

    getID3() 是从MP3等媒体文件中提取文件信息的php类,既可以提取也能修改文件的标签信息.它能读取的文件类型非常多,例如MP3.wav等. 示例官方下载地址:http://sourceforg ...

  5. ubuntu 16.04查询文件安装目录

    dpkg -L filename dpkg -l | grep filename whereis filename find / -name filename

  6. mybaits返回插入成功后的自增值

    mybaits返回插入成功后的自增值 在项目中,我们经常遇到这样的情况:insert语句成功后,需要自增的id值,这个时候,我们可以通过mybatis的 useGeneratedKeys 来实现,具体 ...

  7. saltstack之服务管理

    1.启动服务 /srv/salt/service/nfs.sls rpcbind: service.running: - enable: True #开机自动启动 # - enable: False ...

  8. 嵌入式专题: S5PV210 - MPEG4编码

    我想说不台的平台,如tiny210和x210.它们的头文件是有稍微区别的. 我这个是x210下的代码.但都须要注意的是NV12T与NV12的问题,默认要求输入的图片是NV12T,经过调整之后,能够同意 ...

  9. 一般处理程序页ashx 序列化 Json数组

    json传递数组到一般处理程序页,序列化为实体类的方法,可以解决.ENT framework 3.5以前的项目, 3.5以后的项目可以用System.ServiceModel.Web和System.R ...

  10. PHP-Manual的学习----【安装与配置】

    2017年6月27日17:59:16 安装与配置    安装前需要考虑的事项    Unix系统下的安装    Mac OS x系统下的安装    windows 系统下的安装    云计算平台上的安 ...