定义

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

案例
比方如今有一个画图系统,我们在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,能够通过顺序存储,下一次仅仅存储上一次保存后改变的信息

最新文章

  1. java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;
  2. lucene-查询query-&gt;BooleanQuery “与或”搜索
  3. MVC Autofac 注入点
  4. Lombok(1.14.8) - @Log
  5. Keepass TAN 记录的使用
  6. ORACLE EBS R12 FOR LINUX 开机后如何启动数据库、应用脚本[Z]
  7. 剖析Jetty实现原理
  8. IIS 之 在IIS7、IIS7.5中应用程序池最优配置方案
  9. 镜像的缓存特性 - 每天5分钟玩转 Docker 容器技术(14)
  10. JQuery纵向下拉菜单实现心得
  11. MonolithFirst
  12. c#中string的一些基本用法
  13. NorFlash 学习
  14. Mac下多版本JDK安装
  15. [hadoop] hadoop native libraries 编译
  16. mint-ui是什么?怎么使用?说出至少三个组件使用方法?
  17. Java界面编程—事件的种类
  18. CVE-2013-2551
  19. uboot的配置及编译
  20. 模型的偏差bias以及方差variance

热门文章

  1. Beta冲刺提交-星期三
  2. 共享win7ip,虚拟机nat模式连接,电脑重启之后,无法连接
  3. CAD参数绘mcdbsolid对象(网页版)
  4. java线程池,信号量使用demo
  5. 01XML文档结构
  6. Oracle排名函数(Rank)实例详解
  7. BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
  8. [bzoj2806][Ctsc2012]Cheat(后缀自动机(SAM)+二分答案+单调队列优化dp)
  9. mysql性能优化工具mysqltuner使用
  10. python3.x Day6 socketserver