一. 备忘录模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

结构图:

使用范围:

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

代码:

  1. //备忘录类
  2. //负责存储 Originator 对象的内部状态
  3. class Memento
  4. {
  5. //注意:备忘录类中的方法是私有的!!!!!!!
  6. private:
  7. //这是最关键的地方,将 Originator 为friend类
  8. //这样 Originator 就可以访问 Memento 类的内部信息
  9. friend class Originator;
  10. Memento() {}
  11. Memento(const string& sdt)
  12. {
  13. _sdt = sdt;
  14. }
  15. void SetState(const string& sdt)
  16. {
  17. _sdt = sdt;
  18. }
  19. string GetState()
  20. {
  21. return _sdt;
  22. }
  23. private:
  24. string _sdt;
  25. };
  26. //原始类
  27. //负责创建备忘录
  28. class Originator
  29. {
  30. public:
  31. Originator()
  32. {
  33. _sdt = "";
  34. _mt = 0;
  35. }
  36. Originator(const string& sdt)
  37. {
  38. _sdt = sdt;
  39. _mt = 0;
  40. }
  41. //创建备忘录,将当前信息保存在一个备忘录对象中
  42. Memento* CreateMemento()
  43. {
  44. return new Memento(_sdt);
  45. }
  46. //恢复备忘录,将备忘录对象上的信息恢复出来
  47. void RestoreToMemento(Memento* mt)
  48. {
  49. this->_sdt = mt->GetState();
  50. }
  51. string GetState()
  52. {
  53. return _sdt;
  54. }
  55. void SetState(const string& sdt)
  56. {
  57. _sdt = sdt;
  58. }
  59. void PrintState()
  60. {
  61. cout<<this->_sdt<<"....."<<endl;
  62. }
  63. private:
  64. string _sdt;
  65. Memento* _mt;
  66. };
  67. //测试代码
  68. int main(int argc,char* argv[])
  69. {
  70. Originator* o = new Originator();
  71. o->SetState("old"); //备忘以前的状态
  72. o->PrintState();
  73. Memento* m = o->CreateMemento(); //创建一个备忘录
  74. o->SetState("new"); //修改状态
  75. o->PrintState();
  76. o->RestoreToMemento(m); //恢复修改前的状态
  77. o->PrintState();
  78. return 0;
  79. }

二. 说明

1. Memento 负责存储 Originator 对象的内部状态,并可防止 Originator 以外的其它对象访问备忘录(具体实现方法,就是让其所有方法都为私有的)。

2. Memento 声明 Originator 为它的友元类,这样 Originator 就可以访问它的所有函数,即对 Originator 是开放的。

我觉得,私有和友元是备忘录模式实现的关键!

最新文章

  1. vue学习
  2. Cache Helper类
  3. IE10以下的IE浏览器在form表单提交、a标签等场景下,接收application/json类型的响应时,会提示是否要下载该json文件
  4. AP6181 正基 WIFI 模块
  5. 快速、直接的XSS漏洞检测爬虫 – XSScrapy
  6. nginx的健康检查功能将挂掉的Tomcat舍弃
  7. POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
  8. SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式]
  9. jQuery免费资料
  10. 【原创教程】JavaScript详解之语法和对象
  11. IE下兼容Css+HTML5
  12. [物理学与PDEs]第3章第1节 等离子体
  13. 【转】Windons+jenkins,构建java程序,提示C:\Windows\TEMP\jenkins5037773887088486383.bat Access is denied
  14. C#学习-面向对象语言都有类
  15. JSP通过表格显示数据库的信息
  16. [GO]小技巧,如何实现一个链式操作
  17. session中用户信息改变问题
  18. SQL:(转)数据库中的锁机制(数据库中有哪些锁)
  19. nmcli命令使用
  20. CSS学习要点

热门文章

  1. mybatis执行过程及经典面试题
  2. python爬虫——爬取B站用户在线人数
  3. Eclipse导入别人项目爆红叉
  4. java第3天:Scanner,Random,ArrayList
  5. MySQL8身份验证问题解决
  6. Zabbix监控方案-官方最新4.4版本
  7. url设计规范
  8. Web性能优化:雅虎35条
  9. .net core 3.0 WPF中使用FolderBrowserDialog
  10. HTTP中get和post