C++ 设计模式-备忘录模式

动机
在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公用接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。
定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。
结构
QQ图片20200204203904.png
Memento:备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;
Originator:原发器创建一个备忘录,用以记录当前时刻它的内部状态;我们使用备忘录恢复内部状态;
Caretaker:发出创建备忘录的指令;但是,不能对备忘录的内容进行操作或检查。
管理器向原发器请求一个备忘录,在将来的某个时间,将其送回给原发器;而有的时候管理者不会将备忘录返回给原发器,因为原发器可能不需要退到先前的状态。备忘录是被动的,只有创建备忘录的原发器会对它的状态进行赋值和检索,如下面的时序图:
QQ图片20200206000450.png
示例

class State{
    State(const State& _state);
    /****/
}

class Memento{
    friend class Originator;
    public:
    Memento(State* _pSate)
    :m_sate(new State(_pSate)) {}
    private:
    State* m_state;
}
class Originator{
    public:
    Memento* CreateMemento(){
        return new Memento(m_origin_state);
    }
    void SetMemento(Memento* m){
        if(m_origin_state){
            delete m_origin_state;
        }
        m_origin_state=new State(m);
    }
    private:
    State* m_origin_state;
}
class CareTaker{
    public:
    CareTaker(Originator* _pOriginator)
    :m_pOriginator(_pOriginator) {}
    void Create(){
        m_pMemento=m_pOriginator->CreateMemento();
    }
    void Recover(){
        m_pOriginator->SetMemento(m_pMemento);
    }
    private:
    Menmento* m_pMemento;
    Originator* m_pOriginator;
}

要点总结
1.备忘录(Memento)存储原发器( Originator)对象的内部状态,在需要时恢复原发器状态。
2.由于现代语言运行时(如C#、Java等)都具有相当的对象序列化支持,因此往往采用效率更高、又较容易正确实现的序列化方案来实现Memento模式。

posted @ 2020-02-06 00:11  Redwarx008  阅读(99)  评论(0编辑  收藏  举报