zoukankan      html  css  js  c++  java
  • Memento

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

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

  • 相关阅读:
    38. Count and Say(C++)
    35. Search Insert Position(C++)
    29. Divide Two Integers(C++)
    c++读取utf-8格式中英文混合string
    一种局部二值化算法:Sauvola算法
    Ubuntu 1804 本地显示远程服务器文件
    caffe 预训练 或者Fine-Tuning 操作
    caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: 没有那个文件或目录
    转载---LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别
    [leetcode-921-Minimum Add to Make Parentheses Valid]
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6895901.html
Copyright © 2011-2022 走看看