码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-02-06 01:00:40      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:nat   序列化   memento模式   过程   备忘录   如何   lol   定义   friend   

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

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模式。

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

标签:nat   序列化   memento模式   过程   备忘录   如何   lol   定义   friend   

原文地址:https://www.cnblogs.com/Redwarx008/p/12267409.html

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