定义

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

案例
比方如今有一个画图系统,我们在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. tinyxml

    在TinyXML中,根据XML的各种元素来定义了一些类:        TiXmlBase:整个TinyXML模型的基类.        TiXmlAttribute:对应于XML中的元素的属性.   ...

  2. JZOJ5776. 【NOIP2008模拟】小x游世界树

    题目:[NOIP2008模拟]小x游世界树: 题目的附加题解给的很清楚,这里只给一个代码: #include<iostream> #include<cstdio> #inclu ...

  3. Mysql:sql语句

    练习的表可以在博客的文件中下载 基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机 2:库级知识 2.1 显示数据库: show database ...

  4. asp.net:Parser Error & HTTP 错误 500.21 - Internal Server Error

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABEcAAAF8CAIAAACiwUIQAAAgAElEQVR4nO2dyZHzOpZGaVEaADNkBB ...

  5. 全文搜索(AB-2)-权重

    概念 权重是一个相对的概念,针对某一指标而言.某一指标的权重是指该指标在整体评价中的相对重要程度.权重是要从若干评价指标中分出轻重来,一组评价指标体系相对应的权重组成了权重体系. 释义 等同于比重   ...

  6. Linux下汇编语言学习笔记60 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  7. 易碎的鸟蛋 概率DP

    1007: 易碎的鸟蛋 时间限制: 1 Sec  内存限制: 128 MB提交: 396  解决: 80[提交][状态][讨论版] 题目描述 你们知道吗?西电的跳楼塔上面有一个鸟巢.某SXBK的教授对 ...

  8. Ajax核心知识(2)

    对于Ajax核心的东西需要在进行总结提炼一下: xmlHttp对象. 方法:xml.responseText获取后台传递到前台的数据,经常性的使用var object=xml.responseText ...

  9. [bzoj1874][BeiJing2009 WinterCamp]取石子游戏_博弈论

    取石子游戏 bzoj-1874 BeiJing2009 WinterCamp 题目大意:题目链接. 注释:略. 想法: 我们通过$SG$函数的定义来更新$SG$的转移. 如果是寻求第一步的话我们只需要 ...

  10. 04-js的运算符

    <html> <head> <title>js的运算符学习</title> <meta charset="UTF-8"/> ...