博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我所理解的设计模式(C++实现)——备忘录模式(Memento Pattern)
阅读量:4182 次
发布时间:2019-05-26

本文共 1574 字,大约阅读时间需要 5 分钟。

概述:

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

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

类图和实例:

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

你可能感兴趣的文章
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
在C++中如何实现模板函数的外部调用
查看>>
HTML5学习之——HTML 5 应用程序缓存
查看>>
HTML5学习之——HTML 5 服务器发送事件
查看>>
SVG学习之——HTML 页面中的 SVG
查看>>
mysql中用命令行复制表结构的方法
查看>>