概述:

我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。

这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的redo,undo所采用的模式。

类图和实例:


简单的模式实例,来源于
网上
#include <iostream>
using namespace std;
class NumberMemento
{
friend class NumberOriginator;/*Friend Class for wide interface*/
public:
NumberMemento(){}
virtual ~NumberMemento(){}
/*narrow interface for state*/
virtual int GetNumberState()
{
return this->numberstate;
} virtual void SetNumberState(int _newnumber)
{
this->numberstate=_newnumber;
return;
} private:/*private is for encapsulation*/
int numberstate; /*wide interface for state*/ }; class MementoManager
{
public:
MementoManager(){}
virtual ~MementoManager(){}
/*interface to provide memento*/
virtual void SaveMemento(NumberMemento *_nummemento)
{
this->nummemento=_nummemento;
return;
}
virtual NumberMemento *GetMemento()
{
if(nummemento!=NULL)
return this->nummemento;
else
{
cout<<"No Memento Existed in MementoManager......Please create a memento for MementoManager first!"<<endl;
return NULL;
}
} private:
NumberMemento *nummemento;// be managed memento,can be a list mementos
}; class NumberOriginator
{
public:
NumberOriginator(int _numstate,MementoManager *_manager)
{
this->NumberState=_numstate;
this->mementomanager=_manager;/*Conncetion with manager*/
}
virtual ~NumberOriginator(){} virtual int getNumberState()
{
return this->NumberState;
}
virtual void SetNumberState(int _numstate)
{
this->StoreToMemento();
this->NumberState=_numstate;
return;
}
virtual void RestoreNumberState()/*Undo Operation*/
{
int lastState=(this->mementomanager->GetMemento())->numberstate;/*tell manager that I need memento state*/
(this->mementomanager->GetMemento())->numberstate=this->NumberState;
this->NumberState=lastState;
return;
}
protected:
virtual void StoreToMemento()
{
(this->mementomanager->GetMemento())->numberstate=this->NumberState;/*Use Wide Interface to memento */
return;
}
private:/*Important: 状态的封装性不能被破环*/
int NumberState;/*Number State*/
MementoManager *mementomanager;
}; int main (int argc, char *argv[])
{
/*New A memento and a Manager,and give the memento to manager*/
NumberMemento *memento=new NumberMemento();
MementoManager *caretaker=new MementoManager();
caretaker->SaveMemento(memento);
/*There is a number originator,it ask manager for memento*/
NumberOriginator *num=new NumberOriginator(11,caretaker);
cout<<"\nNumber Original State: "<<num->getNumberState()<<endl;
num->SetNumberState(22);
cout<<"\nNow Number State set tobe: "<<num->getNumberState()<<endl;
num->RestoreNumberState();/*Now Undo it*/
cout<<"\nNow Restore it(with Memento): "<<num->getNumberState()<<endl;
return(0);
}

适用性:

适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。

前提与说明:

备忘录模式使用的前提:

1) 必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。

2) 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

关于第1点,如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。

关于第2点,我们可以让Memento声明Originator为她的私有友元类,这样Originator就可以访问Memento的所有函数。

LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9745019】

其他设计模式文章请参考:我所理解的设计模式

我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  2. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例有一个Message实体类,某 ...

  3. 备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  4. [设计模式] 18 备忘录模式Memento Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存 ...

  5. 用最简单的例子理解备忘录模式(Memento Pattern)

    简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...

  6. 《JAVA设计模式》之备忘录模式(Memento)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...

  7. 23.备忘录模式(Memento Pattern)

    using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...

  8. 备忘录模式-Memento Pattern

    1.主要优点 备忘录模式的主要优点如下: (1)它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原. (2) ...

  9. 十一个行为模式之备忘录模式(Memento Pattern)

    定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...

  10. php备忘录模式(memento pattern)

    晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...

随机推荐

  1. 关于FastDFS Java客户端源码中的一个不太明白的地方

    下面代码是package org.csource.fastdfs下TrackerGroup.java文件中靠近结束的一段代码,我下载的这个源码的版本是1.24. /** * return connec ...

  2. FFmpeg解码H264及swscale缩放详解

    本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程.同时,大部分应用环境下,以原始码流视频大小展示并不是最佳方式,因此 ...

  3. 【转】iOS 通过xib自定义UITableViewCell【原创】

    原文网址:http://blog.it985.com/9683.html 在使用tableView的时候,如果cell的布局过于复杂,通过代码搭建的话不够直观.并且要不停的调整位置,字体什么的.这时, ...

  4. 我的ECshop二次开发从零开始

    我是一个EC新手,EC就算做再多的模板,肯定也满足不了我们的需要,更何况各行有各行的门道,EC统一做出来的模板也不一定合适于我们这个行业用,因此,只有我们真正掌握了自己做模板,修改模板的功夫,才能真正 ...

  5. 打通ssh的方法

    为了实现密码免输入,可以在安全的内网环境中打通ssh.linux和cygwin均可,步骤如下: 由A机去B机.在A生成密钥:ssh-keygen -t rsa,一路回车 将A的~/.ssh/id_rs ...

  6. POJ 2481 Cows

    Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16546   Accepted: 5531 Description ...

  7. [转] ArcGIS engine中气泡标注的添加、修改

    小生 原文 ArcGIS engine中气泡标注的添加.修改! 你微微地笑着,不同我说什么话.而我觉得,为了这个,我已等待得久了.                                   ...

  8. <转>写给浮躁的IT同仁(请不要做浮躁的人)

    1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么.当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异. 2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用 ...

  9. Android-day02_广播

    1.什么是广播 貌似一个人大声喊一句话,别人听到了这就是广播 2.在android中广播有标准广播和有序广播 标准广播也就是发送一个广播,所有人都能同一时间接收到 有序广播则是有顺序的广播,发送的时候 ...

  10. Qt Style Sheets制作UI特效

    使用Qt Style Sheets制作UI特效  博客出处:http://developer.nokia.com/community/wiki/%E4%BD%BF%E7%94%A8Qt_Style_S ...