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,能够通过顺序存储,下一次仅仅存储上一次保存后改变的信息

  • 相关阅读:
    BZOJ 3160 万径人踪灭
    BZOJ 2160 拉拉队排练
    模板 manacher算法
    [Tjoi2016&Heoi2016]求和
    [HZOI 2015]疯狂的机器人
    [BZOJ3456]城市规划
    BZOJ 4372 烁烁的游戏
    洛谷3794 签到题IV
    BZOJ 3730 震波
    BZOJ 4916 神犇和蒟蒻
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6895901.html
Copyright © 2011-2022 走看看