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

备忘录模式旨在对象的外部保存其状态。因此,对于备忘录对象将会有一个维护者 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. QTP自传之测试报告

    前言 测试报告是测试阶段的最后产出,也是最重要的产出,自动化测试报告也是如此.前期所做的工作,添加对象.编写脚本等都是为了可以生成一份正确.严谨的测试报告.我作为一款功能全面的自动化测试工具,毫无疑问 ...

  2. HDOJ(HDU) 2317 Nasty Hacks(比较、)

    Problem Description You are the CEO of Nasty Hacks Inc., a company that creates small pieces of mali ...

  3. Codeforces Round #333 (Div. 1)--B. Lipshitz Sequence 单调栈

    题意:n个点, 坐标已知,其中横坐标为为1~n. 求区间[l, r] 的所有子区间内斜率最大值的和. 首先要知道,[l, r]区间内最大的斜率必然是相邻的两个点构成的. 然后问题就变成了求区间[l, ...

  4. [置顶] 【Git入门之十四】Git GUI

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374495 文章都快写完了,Git GUI才浮出水面,很多人要骂我,这么方 ...

  5. Android网络:开发浏览器(一)——基本的浏览网页功能开发

    我们定义这个版本为1.0版本. 首先,因为要制作一个浏览器,那么就不能通过调用内置浏览器来实现网页的浏览功能,但是可以使用WebView组件来进行. 在此之前,我们可以来看看两种网页显示方式:     ...

  6. hdu4010 Query On The Trees

    Problem Description We have met so many problems on the tree, so today we will have a query problem ...

  7. nvl,空时的推断和取值

    nvl NVL的概念 Oracle/PLSQL中的一个函数. 格式为: NVL( string1, replace_with) 功能:假设string1为NULL,则NVL函数返回replace_wi ...

  8. ubuntu sublime安装及配置

    安装sublime-text-2: sudo add-apt-repository ppa:webupd8team/sublime-text-2 sudo apt-get update sudo ap ...

  9. Spring4.0支持Groovy配置

    介绍 前一段时间观注了一下Spring4.0的一些特性,当中就有对Groovy配置的支持.因为临时还没有很深入的研究.所以举个小样例来说明一下怎样支持Groovy配置. package shuai.s ...

  10. C#使用DataSet类、DataTable类、DataRow类、OleDbConnection类、OleDbDataAdapter类编写简单数据库应用

    //注意:请使用VS2010打开以下的源代码. //源代码地址:http://pan.baidu.com/s/1j9WVR using System; using System.Collections ...