一. 备忘录模式

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

结构图:

使用范围:

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. SpringBoot数据聚合(spring-boot-data-aggregator-starter)

    背景 接口开发是后端开发中最常见的场景, 可能是RESTFul接口, 也可能是RPC接口. 接口开发往往是从各处捞出数据, 然后组装成结果, 特别是那些偏业务的接口. 例如, 我现在需要实现一个接口, ...

  2. CSS3 transform属性

    说明: transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行移动(translate).旋转(rotate).缩放(scale)或倾斜(skew) transition属 ...

  3. Docker实战笔记命令篇

    拉取一个镜像 docker pull ubuntu:14.04 查看系统中的镜像 docker images 运行镜像并进入 docker run -it ubuntu:14.04 查看运行的容器 d ...

  4. B/S 端 WebGL 3D 游戏机教程

    前言 摘要:2D 的俄罗斯方块已经被人玩烂了,突发奇想就做了个 3D 的游戏机,用来玩俄罗斯方块...实现的基本想法是先在 2D 上实现俄罗斯方块小游戏,然后使用 3D 建模功能创建一个 3D 街机模 ...

  5. 两小无猜的爱恨情仇--java =+和+=揭秘

    故事背景 当一个人问另一个人“敢不敢”的时候,另一个人必须说“敢”,这就是游戏的规则.小男孩朱利安和小女孩苏菲的相遇即开始于这样一场孩童的闹剧,一个精美的铁盒子就是他们游戏的见证.说脏话,扰乱课堂,在 ...

  6. Android 世界中,谁喊醒了 Zygote ?

    本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45 文中源码链接: SystemServer.java ActivityManagerService.java ...

  7. css父元素透明度(opacity)对子元素的影响

    首先子元素会继承父元素的透明度: 设置父元素opacity:0.5,子元素不设置opacity,子元素会受到父元素opacity的影响,也会有0.5的透明度. 其次子元素的透明度是基于父元素的透明度计 ...

  8. Faith 信念

    Today I’d like to talk about faith. With faith, you’ll go further and never be lost. Faith is free a ...

  9. redis系列之------数据库

    前言 当我们在Redis数据库中set一个KV的时候,这个KV保存在哪里?如果我们get的时候,又从哪里get出来.时间复杂度,空间复杂的等等,怎么优化等等一系列问题. 服务器中的数据库 Redis服 ...

  10. 基于 Web 端 3D 地铁站可视化系统

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...