(C++实现)——备忘录模式(Memento Pattern)

来源:互联网 发布:淘宝店铺改类别 编辑:程序博客网 时间:2024/05/01 04:08

概述:

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

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

类图和实例:


简单的模式实例:
[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. class Memento {  
  5. private:  
  6.     string state;  
  7.   
  8.   
  9. public:  
  10.     Memento()  
  11.     {  
  12.         state = "";  
  13.     }  
  14.     Memento(string state){  
  15.         this->state = state;  
  16.     }  
  17.     string getState() {  
  18.         return state;  
  19.     }  
  20.     void setState(string state) {  
  21.         this->state = state;  
  22.     }  
  23. };  
  24.   
  25.   
  26. class Originator {  
  27. private :  
  28.     string state;  
  29.   
  30.   
  31. public:  
  32.     Originator()  
  33.     {  
  34.         state = "";  
  35.     }  
  36.   
  37.   
  38.     string getState() {  
  39.         return state;  
  40.     }  
  41.     void setState(string state) {  
  42.         this->state = state;  
  43.     }  
  44.     Memento createMemento(){  
  45.         return Memento(this->state);  
  46.     }  
  47.     void restoreMemento(Memento memento){  
  48.         this->setState(memento.getState());  
  49.     }  
  50. };  
  51.   
  52.   
  53.   
  54.   
  55. class Caretaker {  
  56. private :  
  57.     Memento memento;  
  58. public :  
  59.     Memento getMemento(){  
  60.         return memento;  
  61.     }  
  62.     void setMemento(Memento memento){  
  63.         this->memento = memento;  
  64.     }  
  65. };  
  66. int main (int argc, char *argv[])     
  67. {  
  68.     Originator originator;  
  69.     originator.setState("状态1");  
  70.     cout<<"初始状态:"<<originator.getState()<<endl;  
  71.     Caretaker caretaker;  
  72.     caretaker.setMemento(originator.createMemento());  
  73.     originator.setState("状态2");  
  74.     cout<<"改变后状态:"<<originator.getState()<<endl;  
  75.     originator.restoreMemento(caretaker.getMemento());  
  76.     cout<<"恢复后状态:"<<originator.getState()<<endl;  
  77. }  

适用性:

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

优缺点:

优点:

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

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

缺点:

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



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

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

原创粉丝点击