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. ElasticSearch elasticsearch-servicewrapper 在linux上的安装部署全程记录

    原文地址:http://www.cnblogs.com/tianjixiaoying/p/4316011.html 由于项目需求,需要在linux平台搭建一套ES服务.在搭建过程中,遇到各种各样的问题 ...

  2. 18. 4Sum

    #include <string>#include <stack>#include <vector>#include <map>#include < ...

  3. ambari的重新安装

    ambari是什么呢? 这里我简单说一下ambari的目的,他的目的就是简化hadoop集群的安装和管理.对于安装简化到什么地步呢?只需要几个命令,在页面上配置几个参数,几百几千个节点的集群就能安装成 ...

  4. kvm usb2.0

    Virt-Manager adds support for usb2 Wednesday, April 4, 2012 - 10:40 Haydn Solomon The most recent re ...

  5. Microsoft.Jet.Oledb.4.0 提供者並未登錄於本機電腦上

    最近把一些 .NET2.0 的專案從 x86 的 Server 搬到 x64 的 Server 上,一直都相安無事,直到今天才發現使用 Oledb 讀取 Excel 的時候會跳出「'Microsoft ...

  6. 搜索(DFS)

    不知道为什么~除了我室友其他的同学都觉得DFS很简单~且比BFS容易得多........我真心不觉得啊T T~我真心觉得BFS比DFS简单得多................= = 为了把DFS完全搞 ...

  7. Java Apcahe的HTTPClient工具Http请求当请求超时重发

    java Apcahe的HTTPClient工具Http请求当请求超时时底层会默认进行重发,默认重发次数为3次,在某些情况下为了防止重复的请求,需要将自动重发覆盖. 设置HTTP参数,设置不进行自动重 ...

  8. 利用xshell从windows上传文件到虚拟机

    Xshell实现Windows上传文件到Linux主机 经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下:之前我 ...

  9. MFC发送自定义消息-PostMessage和SendMessage

    PostMessage:把消息投放到线程的消息队列,不能消息被处理就立即返回SendMessage:消息被处理完后才返回 几种发送消息的写法:   ::PostMessage(GetSafeHwnd( ...

  10. 【转载】NativeSQL实例

    转自:http://blog.sina.com.cn/s/blog_3f2c03e301017fqz.html     ---------------------------------------- ...