//---------------------------15/04/27----------------------------

//Memento 备忘录模式----对象行为型模式

/*

1:意图:

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可讲该对象

恢复到原先保存的状态。

2:别名:

Token

3:动机:

4:适用性:

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

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

5:结构:

Caretaker:

Originator:- - - - - - - - >Memento:<---------memento

SetMemento(Memento m)       GetState()

{ state = m->GetState()}    SetState()

CreateMemento()             state

{ retrun new Memento(state)}

state

6:参与者:

1>Memento:

1)备忘录存储原发器的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态。

2)防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者接口只能看到备忘录的窄

接口--它只能讲备忘录传递给其他对象。相反,原发器能看到一个宽接口,允许它访问返回到先前状态

所需的所有数据。

2>Originator

1)原发器创建一个备忘录,用以纪录当前时刻它的内部状态。

2)使用备忘录恢复内部状态。

3>Caretaker

1)负责保存好备忘录。

2)不能对备忘录的内容进行操作或检查。

7:协作:

1>管理器向原发器请求一个备忘录,保存一段时间后,将其送回原发器。

2>备忘录时被动的。只有创建备忘录的原发器会对他的状态进行赋值和检索。

8:效果:

1>优点:

1)保护封装边界:

使用备忘录可以避免暴露一些只应由原发器管理却又必须存储在原发器之外的信息。

2)简化了原发器:

让客户来管理它们请求的状态会简化原发器,并且似的客户工作结束时无需通知原发器。

2>缺点:

1)使用备忘录可能代价很高:

如果原发器在生产备忘录时必须拷贝并存储大量的信息,或者客户非常频繁地创建备忘录和恢复原发器

状态,可能会导致非常大的开销。

2)维护备忘录的潜在代价:

管理器负责删除它所维护的备忘录,然后管理器不知道备忘录中有多少个状态。因此当存储备忘录时,

一个本来很小的管理器,可能会产生大量的存储开销。

3>定义窄接口和宽接口:

在一些语言中可能难以保证只有原发器可以访问备忘录的状态。

9:实现:

1>语言支持:

备忘录有两个接口:一个为原发器所使用的宽接口,一个为其他对象所使用的窄接口。

在c++可以声明Originator为Memento的一个友元,并使用Memento宽接口为私有的,把窄接口声明为公有。

2>存储增量式改变:

如果备忘录的创建及其返回的顺序是可预测的,备忘录可以仅存储原发器内部状态的增量改变。

10:代码示例:                                                                            */

class Graphic;

//Caretaker,提供操作

class MoveCommand

{

public:

MoveCommand(Graphic* target,
const Point& delta);

void Execute();

void Unexecute();

private:

ConstraintSolverMemento* _state;

Point _delta;

Graphic* _target;

};

//原发器:提供创建,保存,撤销操作

class ConstraintSolver

{

public:

static ConstraintSolver* Instance();

void Solve();

void AddConstraint(Graphic* startConnection, Graphic* endConnection);

void RemoveConstaint(Graphic* startConnection, Graphic* endConnection);

ConstraintSolverMemento* CreateMemento();

void SetMemento(ConstraintSolverMemento*);

private:

};

//备忘录

class ConstraintSolverMemento

{

public:

virtual ~ConstraintSolverMemento();

private:

friend class ConstraintSolver;

ConstraintSolverMemento();

//...还有一些state

};

//使用原发器创建一个备忘录,保存起来,然后做别的操作

void MoveCommand::Execute()

{

ConstraintSolver* solver = ConstraintSolver::Instance();

_state = solver->CreateMemento();

_target->Move(_delta_);

solver->Solve();

}

//使用之前存储的备忘录来恢复之前的状态。

void MoveCommand::Unexecute()

{

ConstraintSolver* solver = ConstraintSolver::Instance();

_target->Move(-_delta);

solver->SetMemento(_state);

solver->Solve();

}

//这个例子没法恢复两次以上状态,如果要恢复两次以上,必须使用数组或链表把一个个备忘录存储起来。

设计模式 笔记 备忘录模式 Memento的更多相关文章

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

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

  2. 设计模式之备忘录模式(Memento)

    备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...

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

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

  4. 【设计模式】—— 备忘录模式Memento

    前言:[模式总览]——————————by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...

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

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

  6. 学习笔记——备忘录模式Memento

    备忘录模式,可以将当前状态保存,并随时恢复. Originator存在状态state,当需要保存此状态时,通过CreateMemento创建一个备忘录对象Memento保存此状态:而需要恢复相应状态时 ...

  7. 行为型设计模式之备忘录模式(Memento)

    结构 意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 适用性 必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时 ...

  8. 再起航,我的学习笔记之JavaScript设计模式24(备忘录模式)

    备忘录模式 概念介绍 备忘录模式(Memento): 在不破坏对象的封装性的前提下,在对象之外捕获并保存该对象内部的状态以便日后对象使用或者对象恢复到以前的某个状态. 简易分页 在一般情况下我们需要做 ...

  9. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

随机推荐

  1. PHP将Base64图片转换为本地图片并保存

    本文出至:新太潮流网络博客 /** * [将Base64图片转换为本地图片并保存] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB h ...

  2. Prometheus Node_exporter 之 FileSystem Detail

    FileSystem Detail /proc/filesystems 1. Filesystem space available type: GraphUnit: bytesLabel: Bytes ...

  3. 一般处理程序HttpHandler的应用

    ashx 一般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是其扩展名.一个httpHandler接受并处理一个http请求,类比于Java中的servlet.类比于在Ja ...

  4. KB和KiB的区别

    差别是KB等单位以10为底数的指数,KiB是以2为底数的指数. K 与 Ki 分别表示 kilo-(千) 与 kibi-(二进制千) .作为前缀使用时, k 表示 1,000,Ki 表示1,024. ...

  5. 微信小程序审核 出现85085 提交审核数量过多问题

    前段时间发布了一个新版本小程序(错误代码:85085,说明:submit audit reach limit, please try later hint: [OKYBha04570729]),由于我 ...

  6. 一起学习Boost标准库--Boost.StringAlgorithms库

    概述 在未使用Boost库时,使用STL的std::string处理一些字符串时,总是不顺手,特别是当用了C#/Python等语言后trim/split总要封装一个方法来处理.如果没有形成自己的com ...

  7. glViewport()函数和glOrtho()函数的理解(转)

    http://www.cnblogs.com/yxnchinahlj/archive/2010/10/30/1865298.html 在OpenGL中有两个比较重要的投影变换函数,glViewport ...

  8. Linux运维之系统性能瓶颈工具vmstat分析

    vmstat是一个很好用的检测系统性能工具,没有过多的参数,直接一个vmstat命令即可,不过我们一般加上-w表示宽格式输出.然后再附加上侦测时间即可 例如: vmstat 表示每3秒检测一次并输出系 ...

  9. iOS资源大全中文版

    我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-ios 就是 vsouza 发起维护的 iOS 资源列表,内容包括:框架.组件.测试.App ...

  10. 折射向量计算(Refraction Vector Calculation)

    上个月学习Peter Shirley-Ray Tracing in One Weekend的系列三本书,收获真的很多.这个系列的书真的是手把手教你如何从零开始构建一个光线跟踪渲染器,对新手(像我)非常 ...