首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C++实现 备忘录模式

C++实现 备忘录模式

概述:

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

    这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的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)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。
返回列表