我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)

来源:互联网 发布:半钢子午胎数据 编辑:程序博客网 时间:2024/05/21 20:29

概述:

    我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。

    这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的redo,undo所采用的模式。

类图和实例:


简单的模式实例:
#include <iostream>#include <string>using namespace std;class Memento {private:    string state;public:    Memento()    {        state = "";    }    Memento(string state){        this->state = state;    }    string getState() {        return state;    }    void setState(string state) {        this->state = state;    }};class Originator {private :    string state;public:    Originator()    {        state = "";    }    string getState() {        return state;    }    void setState(string state) {        this->state = state;    }    Memento createMemento(){        return Memento(this->state);    }    void restoreMemento(Memento memento){        this->setState(memento.getState());    }};class Caretaker {private :    Memento memento;public :    Memento getMemento(){        return memento;    }    void setMemento(Memento memento){        this->memento = memento;    }};int main (int argc, char *argv[])   {    Originator originator;    originator.setState("状态1");    cout<<"初始状态:"<<originator.getState()<<endl;    Caretaker caretaker;    caretaker.setMemento(originator.createMemento());    originator.setState("状态2");    cout<<"改变后状态:"<<originator.getState()<<endl;    originator.restoreMemento(caretaker.getMemento());    cout<<"恢复后状态:"<<originator.getState()<<endl;}

适用性:

适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。 

优缺点:

优点:

1)当发起人角色的状态有改变时,有可能是个错误的改变,我们使用备忘录模式就可以把这个错误改变还原。

2)备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。

缺点:

1)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。



LCL_data原创于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9745019】

其他设计模式文章请参考:我所理解的设计模式

原创粉丝点击