现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

设计模式之C++实现(9):备忘录模式(Memento Pattern)

2015-08-29 14:05 工业·编程 ⁄ 共 1702字 ⁄ 字号 暂无评论

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

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

给我留言

留言无头像?