一. 备忘录模式

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

结构图:

使用范围:

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. opencv边缘检测-拉普拉斯算子

    sobel算子一文说了,索贝尔算子是模拟一阶求导,导数越大的地方说明变换越剧烈,越有可能是边缘. 那如果继续对f'(t)求导呢? 可以发现"边缘处"的二阶导数=0. 我们可以利用这 ...

  2. ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者

    本文翻译自:https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel ...

  3. JVM(一)内存分配

    方法区: ①存储被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码数据 ②又称为永久代,仅对于Hotspot来讲,JRockit和IBM J9里面没有永久代的概念,1.8以后是元空间,直接使 ...

  4. Flutter学习笔记(29)--Flutter如何与native进行通信

    如需转载,请注明出处:Flutter学习笔记(29)--Flutter如何与native进行通信 前言:在我们开发Flutter项目的时候,难免会遇到需要调用native api或者是其他的情况,这时 ...

  5. 【原创】(七)Linux内存管理 - zoned page frame allocator - 2

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  6. angular之路由

    一.核心问题 路由要解决的核心问题是通过建立url和页面之间的对应的关系,使不同的页面可以通过不用的url来展示. 首先,当用户在浏览器上输入URL后,Angular将获取该URL并将其解析生成一个U ...

  7. http post 请求,带参数,带请求头

    #!/usr/bin/env python # -*- coding: utf-8 -*- import requests import json url = 'http://............ ...

  8. cookie和session,cookie和web storage

    一.cookie和session cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式. session指的是访问者从到达某个特定页面到离开为止 ...

  9. Java 8 Optional:优雅地避免 NPE

    本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查.在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的. 空指针异常(NullPo ...

  10. sqli-labs靶机注入笔记1-10关

    嗯,开始记录sqli-lab的每关笔记,复习一次 1-2关 基于错误的字符串/数字型注入 闭合的符号有区别而已 http://www.sqli-lab.cn/Less-1/?id=1 or 1=1 - ...