Memento 模式的关键就是要在不破坏封装行的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作。

 /////////Originator.h//////////////////////////////////////////
#pragma once
#include <string>
using namespace std;
typedef string State ; class Memento ;
class Originator
{
public:
Originator();
Originator(const State& std);
~Originator();
Memento* GreatMemento();
void SetMemento();
void RestoreToMemento();
State GetState();
void SetState(const State& sdt);
void PrintState(); protected:
private:
State _sdt ;
Memento* _mt;
};
/////////Memento.h//////////////////////////////////
#pragma once
#include <string>
using namespace std; typedef string State ; class Memento
{
public:
protected:
private:
friend class Originator ;
Memento();
Memento(const State& sdt);
~Memento();
void SetState(const State& sdt);
State GetState();
State _sdt ; };
 ////////////Originator.cpp/////////////////////////////////////////////////
#include "Originator.h"
#include "Memento.h"
#include <iostream>
using namespace std;
Originator::Originator(const State& std)
{
_sdt = std ;
_mt = ;
}
Originator::Originator()
{
_sdt = "" ;
_mt = ;
}
void Originator::SetMemento()
{
if (_mt == )
{
this->_mt = GreatMemento();
}
else
{
_mt->SetState(_sdt);
} }
Memento* Originator::GreatMemento()
{
return new Memento(_sdt);
}
void Originator::RestoreToMemento()
{
if (this->_mt != )
{
_sdt = _mt->GetState();
} }
void Originator::SetState(const State& sdt)
{
_sdt = sdt ;
} State Originator::GetState()
{
return _sdt;
} void Originator::PrintState()
{
cout<<this->_sdt<<"....."<<endl;
}
Originator::~Originator()
{
delete _mt;
}
 ///////////Memento.cpp/////////////////////////
#include "Memento.h"
#include <string>
using namespace std; typedef string State ; Memento::Memento(const State& sdt)
{
_sdt = sdt ;
}
Memento::Memento()
{ }
void Memento::SetState(const State& sdt)
{
_sdt = sdt ;
} State Memento::GetState()
{
return _sdt ;
}
Memento::~Memento()
{ }
 ///////////////main.cpp///////////////////////////////////////////////////////////
#include "Memento.h"
#include "Originator.h"
#include <string>
#include <iostream>
using namespace std; typedef string State ; int main()
{
Originator* O = new Originator();
O->SetState("备忘前状态 Old");
O->PrintState(); O->SetMemento();//备忘 O->SetState("备忘后状态 New");
O->PrintState(); O->RestoreToMemento();//恢复 O->PrintState(); getchar();
return ;
}

Memento 模式的更多相关文章

  1. 【行为型】Memento模式

    备忘录模式顾名思义就是一种能有备忘作用的设计模式,其目的是在对象外部保存其在某一时刻的状态信息,并且在任何需要的时候,都可以通过备忘录中保存的状态数据恢复对象在当时情形下的状态. 备忘录模式旨在对象的 ...

  2. Java设计模式(15)备忘录模式(Memento模式)

    Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...

  3. 设计模式之——Memento模式

    Memento模式即快照模式,就是在某一时刻,设定一个状态,在后面随时可以返回到当前状态的模式. 我们拿一个闯关游戏作为举例,一共有十关,每闯一关,玩家所持金额增加一百,而闯关失败就扣一百.初始时,给 ...

  4. memento模式

    参考资料 • 维基百科:https://en.wikipedia.org/wiki/Memento_pattern • 百度百科:http://baike.baidu.com/link?url=ZQZ ...

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

    Memento模式? 使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态.这个时候你需要使用Memento设计模式.(以 ...

  6. C++设计模式实现--备忘录(Memento)模式

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比較适用于功 ...

  7. Behavioral模式之Memento模式

    1.意图 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. 2.别名 Token 3.动机 有时候有必要记录一个对象的内部状态.为 ...

  8. 设计模式(十八)Memento模式

    在使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态. 要想恢复实例,需要一个可以自由访问实例内部结构的权限.但是,如果 ...

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

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...

随机推荐

  1. 关于 Unity NavMesh 数据的访问

    目前的工作需要加入自动寻路,后来决定使用 unity 自带的 NavMesh,但有个问题是这个寻路数据,服务器也是需要的,那么我就要把这个数据导出为服务器所用才行.      但 NaveMesh 暂 ...

  2. 理解wait notify的好例子

    import java.util.concurrent.TimeUnit; public class Example2 { /** * @param args */ public static voi ...

  3. Bzoj 3343: 教主的魔法 分块,二分

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 364[Submit][Status][Discuss ...

  4. 高级IO复用应用:聊天室程序

    简单的聊天室程序:客户端从标准输入输入数据后发送给服务端,服务端将用户发送来的数据转发给其它用户.这里采用IO复用poll技术.客户端采用了splice零拷贝.服务端采用了空间换时间(分配超大的用户数 ...

  5. 记录:Ubuntu下安装mysql

    >>更新源列表 在终端中输入:sudo apt-get update 更新完成后输入:sudo apt-get install mysql-server mysql-client 接着输入 ...

  6. 【设计模式 - 21】之空对象模式(Null Object)

    1      模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...

  7. 最严格的身份证校验(JavaScript版)

    在JavaWeb研发过程中为了获取有效的用户信息,校验其数据的有效性非常是必要,以下贴出在项目中用到的关于身份证的校验: <!DOCTYPE HTML PUBLIC "-//W3C// ...

  8. oracle8

    数据库管理 -- 管理表空间和数据文件 表空间是数据库的逻辑组成部分.从物理上讲,数据库数据存放在数据文件中:从逻辑上讲,数据库则是存放在表空间中,数据管理是以表空间管理的,表空间由一个或多个数据文件 ...

  9. XC文件管理器(Android应用)

    XC文件管理器,是基于Android4.4开发的一个方便易用的文件管理器,具有文件的目录管理和文件的管理,主要包括文件的新建.删除.重命名.复制,移动剪切以及文件详情查看等文件和目录的功能,同时支持文 ...

  10. mac 下 php 安装 中的坑

    brew Error: Formulae found in multiple taps http://www.trylife.cn/brew-error-formulae-found-in-multi ...