定义

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

案例
比方如今有一个画图系统,我们在Viewer里面画了一些图形,可是在绘制的过程中可能画出的图像不是想要的,这时候须要到正确的绘制状态,这时候能够在每次绘制的时候保存绘制的状态信息。可是要在不改变Viewer的封装性的前提下实现。有点困难,这时候就能够使用备忘录模式。

一个备忘录Memento是一个对象,它存储还有一个对象在某个瞬间的内部状态,后者称为备忘录的原发器(originator):



Memento类是用来保存Viewer的相关状态:
  1. class Memento
  2. {
  3. public:
  4. void setState(State* state) { m_state = state; }
  5. State* state() const { return m_state; }
  6. private:
  7. friend class Viewer;
  8. Memento() { }
  9. private:
  10. State* m_state;
  11. };
Viewer是Memento的友元类,能够在须要的时刻创建Memento对象,来保存自身的状态信息:
  1. class Viewer
  2. {
  3. public:
  4. void drawGraphics();
  5. Memento* createMemento();
  6. void setMemento(Memento* memento);
  7. };
  8. Memento* Viewer::createMemento()
  9. {
  10. State* state = getSelfState();
  11. Memento* memento = new Memento();
  12. memento->setState(state);
  13. return memento;
  14. }
  15. void setMemento(Memento* memento)
  16. {
  17. setSelfState(memento->state());
  18. }
Command类是用来绘制图形。并能够回滚操作:
  1. class Command
  2. {
  3. public:
  4. void execute();
  5. void unExecute();
  6. private:
  7. Viewer* m_viewer;
  8. std::vector<Memento*> m_mementos;
  9. };
  10. void Command::execute()
  11. {
  12. m_viewer->drawGraphics();
  13. m_mementos.push_back(m_viewer->createMemento());
  14. }
  15. void Command::unExecute()
  16. {
  17. if(!m_memento.isEmpty())
  18. {
  19. m_viewer->setMemento(m_mementos.back());
  20. m_mementso.pop_back();
  21. }
  22. }
效果
  1. 保持封装,避免了暴露由自身管理但必须存储在自身之外的数据
  2. 简化了原发器Viewer,把管理存储状态信息的重任交给了Memento
  3. 使用代价高,可能因为频繁的操作创建了大量的Memento,能够通过顺序存储,下一次仅仅存储上一次保存后改变的信息

Memento - 备忘录模式的更多相关文章

  1. 设计模式20:Memento 备忘录模式(行为型模式)

    Memento 备忘录模式(行为型模式) 对象状态的回溯 对象状态的变化无端,如何回溯.恢复对象在某个点的状态? 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某 ...

  2. C++设计模式-Memento备忘录模式

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

  3. 设计模式(18)--Memento(备忘录模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. ...

  4. 18、Memento 备忘录模式

    例如:用于记录快照(顺势状态).存盘 1.Memento Memento设计模式是一种软件设计模式,用于将对象回滚到其先前状态.它是行为设计模式的一部分,与算法和对象之间的职责分配有关. 行为模式描述 ...

  5. C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...

  6. Java 设计模式系列(十八)备忘录模式(Memento)

    Java 设计模式系列(十八)备忘录模式(Memento) 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式.备忘录对象是一个用来存储另外一个对象内部状态 ...

  7. 行为型模式(十) 备忘录模式(Memento)

    一.动机(Motivate) 我们看上图,一个对象肯定会有很多状态,这些状态肯定会相互转变而促进对象的发展,如果要想在某一时刻把当前对象回复到以前某一时刻的状态,这个情况用"备忘录模式&qu ...

  8. C#设计模式之二十二备忘录模式(Memeto Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就 ...

  9. 十八、Memento 备忘录设计模式

    原理: 代码清单: Memento public class Memento { int mondey; ArrayList fruits; Memento(int mondey){ this.mon ...

随机推荐

  1. git的使用 及一些常见的错误处理

    git安装使用 添加文件到Git仓库,分两步: 1.使用命令git add <file>,注意,可反复多次使用,添加多个文件: 2.使用命令git commit -m <messag ...

  2. TensorFlow低阶API(一)—— 简介

    简介 本文旨在知道您使用低级别TensorFlow API(TensorFlow Core)开始编程.您可以学习执行以下操作: 管理自己的TensorFlow程序(tf.Graph)和TensorFl ...

  3. DEALLOCATE - 删除一个准备好的查询

    SYNOPSIS DEALLOCATE [ PREPARE ] plan_name DESCRIPTION 描述 DEALLOCATE 用于删除前面准备好的查询. 如果你没有明确 DEALLOCATE ...

  4. asp 数据库 模块化 - 思路是没一个页面有一个自己的数据类 这里用nPath表示

    <!--#include file="db_class.asp" --> <% '当前页面数据 nPath = "..\..\.." 't模块 ...

  5. CAD交互绘制带颜色宽度的直线(com接口)

    用户可以在控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE dY ...

  6. 【东软实训】SQL函数

    SQL函数 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp”的表,接下来的操作都将 ...

  7. oracle分析函数之ratio_to_report

    ratio_to_report主要完成对百分比的计算,语法为ratio_to_report(exp) over()也就是根据over窗口函数的作用区间,求出作用区间中的单个值在整个区间的总值的比重比如 ...

  8. copy on write

    yl::string CBaseAutopProcessor::AddAuthorizedInfo(const yl::string & strOriginalUrl, const yl::s ...

  9. 1 SQL 数据库和SQL

    1 数据库和SQL 1-1 数据库是什么 将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合称为数据库(Database, DB). 法则 用来管理数据库的计算机系统称为数据库管理系统 ...

  10. 零基础入门学习Python(20)--函数:内嵌函数和闭包

    知识点 global关键字 使用global关键字,可以修改全局变量: >>> count = 5 >>> def Myfun(): count = 10 prin ...