码迷,mamicode.com
首页 > 其他好文 > 详细

Memento - 备忘录模式

时间:2014-07-23 13:39:37      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

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

案例
比如现在有一个绘图系统,我们在Viewer里面画了一些图形,但是在绘制的过程中可能画出的图像不是想要的,这时候需要到正确的绘制状态,这时候可以在每次绘制的时候保存绘制的状态信息,但是要在不改变Viewer的封装性的前提下实现,有点困难,这时候就可以使用备忘录模式。一个备忘录Memento是一个对象,它存储另一个对象在某个瞬间的内部状态,后者称为备忘录的原发器(originator):
bubuko.com,布布扣
bubuko.com,布布扣
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 - 备忘录模式,布布扣,bubuko.com

Memento - 备忘录模式

标签:style   blog   http   color   使用   os   

原文地址:http://blog.csdn.net/harrising/article/details/38052709

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!