一. 备忘录模式

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

结构图:

使用范围:

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 是开放的。

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

设计模式C++描述----17.备忘录(Memento)模式的更多相关文章

  1. C++设计模式实现--备忘录(Memento)模式

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比較适用于功 ...

  2. 设计模式(十八)Memento模式

    在使用面向对象编程的方式实现撤销功能时,需要事先保存实例的相关状态信息.然后,在撤销时,还需要根据所保存的信息将实例恢复至原来的状态. 要想恢复实例,需要一个可以自由访问实例内部结构的权限.但是,如果 ...

  3. 备忘录(Memento)模式

    备忘录模式又叫做快照模式或者Token模式. 备忘录对象是一个用来存储另一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来 ...

  4. 《图解设计模式》读书笔记8-2 MEMENTO模式

    目录 Memento模式 示例代码 程序类图 代码 角色和类图 模式类图 角色 思路拓展 接口可见性 保存多少个Memento 划分Caretaker和Originator的意义 Memento模式 ...

  5. Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式

    在大部分游戏中,都有一个"存档点"的概念.比如,在挑战boss前,游戏会在某个地方存档,假设玩家挑战boss失败,则会从这个存档点開始又一次游戏.因此,我们能够将这个"存 ...

  6. 设计模式C++描述----09.桥接(Bridge)模式

    一. 举例 N年前: 计算机最先出来时,软件和硬件是一绑在一起的,比如IBM出了一台电脑,上面有一个定制的系统,假如叫 IBM_Win,这个IBM_Win系统当然不能在HP电脑上运行,同样HP出的HP ...

  7. 设计模式C++描述----22.访问者(Visitor)模式

    一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...

  8. 设计模式C++描述----21.解释器(Iterpreter)模式

    一. 解释器模式 定义:给定一个语言,定义它的文法的一种表示,并定一个解释器,这个解释器使用该表示来解释语言中的句子. 结构如下: 代码如下: //包含解释器之外的一些全局信息 class Conte ...

  9. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

随机推荐

  1. C语言I—2019秋作业02

    1.[新增内容] 这个作业属于那个课程 C语言程序设计 这个作业要求在哪里 <C语言I-2019秋作业02> 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 <实现一些基 ...

  2. 安装/删除MySQL数据库

    MySQL的数据存储目录为data,data目录通常在C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5 ...

  3. win10 cnpm安装完之后一直说不是内部命令的原因

    找到cnpm的默认安装路径 一般默认的是 D:\Program Files\nodejs\node_modules 然后添加环境变量中 win10是在系统环境变量中切记不是在用户变量中.保存之后,重新 ...

  4. Android中内存泄露与如何有效避免OOM总结

    一.关于OOM与内存泄露的概念 我们在Android开发过程中经常会遇到OOM的错误,这是因为我们在APP中没有考虑dalvik虚拟机内存消耗的问题. 1.什么是OOM OOM:即OutOfMemoe ...

  5. LitePal的聚合函数

    传统的聚合函数用法   虽说是聚合函数,但它的用法其实和传统的查询还是差不多的,即仍然使用的是select语句.但是在select语句当中我们通常不会再去指定列名,而是将需要统计的列名传入到聚合函数当 ...

  6. 纯CSS焦点轮播效果-功能可扩展

    个人博客: http://mcchen.club 纯CSS3实现模拟焦点轮播效果,支持JQ等扩展各项功能.废话少说,直接贴代码. <!DOCTYPE html> <html> ...

  7. url设计规范

    一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...

  8. LeetCode_155-Min Stack

    栈的实现,多加了一个最小值的获取 class MinStack { public: struct Node { int nNum; int nMinNum; Node* pNext; Node() { ...

  9. Stock Charts

    Description You're in the middle of writing your newspaper's end-of-year economics summary, and you' ...

  10. Real Beauty真正的美丽

    [1]Beauty is only skin-deep. Physical beauty can only be held fleetingly. Real beauty is much deeper ...