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. php中的variables_order

    PHP中的$_ENV是一个包含服务器端环境变量的数组.它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它.     $_ENV只是被动的接受服务器端的环境变量并把它们转换为数组元 ...

  2. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  3. Redis未授权访问缺陷让服务器沦为肉鸡

    朋友的一个项目说接到阿里云的告警,提示服务器已沦为肉鸡,网络带宽被大量占用,网站访问很慢,通过SSH远程管理服务器还频繁断开链接.朋友不知如何下手,便邀请我帮忙处理. 阿里云的安全告警邮件内容: 在没 ...

  4. IO(Input Output)流__字节流

    续: ------->>>>字节流 IntputStream  OutputStream 需求:想要操作图片数据,就需要用到字节流. 读写操作: FileOutputStrea ...

  5. jetty服务器

    1,http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin 2,http://wiki.eclipse.org/Jetty#Getting_S ...

  6. SQL GROUP BY GROUPING SETS,ROLLUP,CUBE(需求举例)

    实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专 ...

  7. 【MongoDB安装和基础学习系列】

    转:http://www.cnblogs.com/lipan/archive/2011/03/08/1977691.html 系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     ...

  8. Spring/Hibernate Improved SQL Logging with log4jdbc---reference

    Hibernate provides SQL logging out of the box, but such logging only shows prepared statements, and ...

  9. c语言中的 %u 什么意思啊?

    %d 有符号10进制整数 %i 有符号10进制整数 %o 无符号8进制整数 %u 无符号10进制整数 %x 无符号的16进制数字,并以小写abcdef表示%X 无符号的16进制数字,并以大写ABCDE ...

  10. struts2 自定义拦截,防止非法操作

    <package name="defaults" extends="struts-default"> <interceptors> &l ...