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

备忘录模式旨在对象的外部保存其状态。因此,对于备忘录对象将会有一个维护者 MementoManager 对象,用于维护对象所对应的所有备忘录对象列表,并在适当的时候需要负责清除掉这些备忘录对象。模式的类结构图参考如下:

模式的编码结构代码参考如下:

 namespace memento
{
typedef int TData;
class Memento
{
public:
// some code here........
friend class Target;
private:
inline const TData getStateData() const { return m_StateData; } private:
TData m_StateData; };//class Memento class Target
{
public:
// some code here........
Memento* createMemento() { return new (std::nothrow) Memento(); }
void setMemento(Memento* pMemento) {
if (nullptr != pMemento) {
pMemento->m_StateData = this->m_StateData;
}
} private:
TData m_StateData; };//class Target class MementoManager
{
public:
// some code here........ ~MementoManager() { this->clearAllMementos(); } void clearAllMementos() { /*some code here........*/ } private:
typedef std::deque<Memento*> TMementoDeq; TMementoDeq m_deqMementos; };//class MementoManager }//namespace memento

Memento模式编码结构代码参考

备忘录模式的一些题外话:

面向对象设计的其中一个特性就是封装,其目的就是为了尽量将对象的状态属性有效地保护起来不被外界任意修改。因此,对于前面的Target::m_StateData数据最好也是要尽量保证该(封装)特性,并且对于其Memento对象中保存的备份状态数据最好也只能够由Target专用。但是对于不同的语言,在使用备忘录模式时,是不一定都能够保证到该特性不被破坏的。像C++这样的语言,因为有friend这种语法机制的支持,它可以在该特性上得到保证。其他的一些语言如 object pascal 这样的语言就不一定能够保证了。因此,最终使用该模式时,还需要视具体的情况而定。

备忘录模式的应用场合:

在许多应用场合都可以使用备忘录模式。

比如:大到游戏数据的备份,如:像Diabol这样的经典大型单机游戏,其中有个角色存档的行为,其实就可以使用备忘录模式来设计。

比如:项目中的用户操作习惯或操作痕迹记录,也可以使用该模式。此时备忘录模式可结合本地配置来永久存档。

比如:备忘录模式配合Command模式以及Iterator模式来实现类似Photoshop的操作历史记录面板那样的功能。

........

只要理解了模式的目的意图,相信实际项目中的许多场合都能用的上它。

【行为型】Memento模式的更多相关文章

  1. Memento 模式

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

  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. ssh非交互式密码输入

    ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这一问题.sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码. 它允许你用 -p 参数指定明文密码,然后直接登 ...

  2. Greenplum 数据库架构分析

    Greenplum 数据库是最先进的分布式开源数据库技术,主要用来处理大规模的数据分析任务,包括数据仓库.商务智能(OLAP)和数据挖掘等.自2015年10月正式开源以来,受到国内外业内人士的广泛关注 ...

  3. 3rd day

    今天学习创建了几个简单的表:

  4. Java学习的随笔(一)对象概念、this指针、权限修饰符

    最近在看<Java编程思想>,下面按照最近看书的顺序梳理一下心得,由于是初次学习,大部分心得是摘抄自书中: 1. Java中,每个变量都是一个对象. 在创建时首先在内存的堆栈中创建一个该对 ...

  5. Java POI导入Excel文件

    今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar ...

  6. 使用搬瓦工搭建javaweb环境

        /* 本文是基于搬瓦工vps的centos-6-x86_64的Linux系统搭建. 需准备的工具:1.putty(用于连接Linux系统)  2.WinSCP(搬瓦工官方提供的ftp上传下载工 ...

  7. 详谈typedef的用法

    我们都知道typedef是类型重定义,既然是重定义就不可能出现新的数据类型,只是将已有的数据类型进行换个名字而已,但是这有什么用呢?可能我们学的时候,给的例子都是:typedef int INT; 然 ...

  8. Rx RxJava【Operators】操作符

    操作符分类 ReactiveX的每种编程语言的实现都实现了一组操作符的集合.不同的实现之间有很多重叠的部分,也有一些操作符只存在特定的实现中.每种实现都倾向于用那种编程语言中他们熟悉的上下文中相似的方 ...

  9. 关于AuthorizeAttribute使用

    在开发中,假如你只对一个角色进行权限处理,你可以这么写 class ActionAuthAttribute : AuthorizeAttribute { private RoleType _roleT ...

  10. MySQL存储过程详解 mysql 存储过程(二)

    mysql存储过程详解 1.      存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL ...