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

概述:

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

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

类图和实例:


简单的模式实例:
[cpp]  view plain copy
  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)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值