• 备忘录模式 行为型模式之八


    1.定义

             备忘录模式是一种行为型的软件设计模式,在不破坏封装的前提下,获取一个对象的内部状态,并在对象外保存该状态,当对象需要恢复到该状态时,对其进行恢复。

    2.组成结构

    1. 原发器 (Originator) 类可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。
    2. 备忘录 (Memento) 是原发器状态快照的值对象 (value object)。 通常做法是将备忘录设为不可变的, 并通过构造函数一次性传递数据。
    3. 负责人 (Caretaker) 仅知道 “何时” 和 “为何” 捕捉原发器的状态, 以及何时恢复状态。负责人通过保存备忘录栈来记录原发器的历史状态。 当原发器需要回溯历史状态时, 负责人将从栈中获取最顶部的备忘录, 并将其传递给原发器的恢复 (restoration) 方法。

            在该实现方法中, 备忘录类将被嵌套在原发器中。 这样原发器就可访问备忘录的成员变量和方法, 即使这些方法被声明为私有。 另一方面, 负责人对于备忘录的成员变量和方法的访问权限非常有限: 它们只能在栈中保存备忘录, 而不能修改其状态。

    3.示例代码

    1. //Memento.h
    2. /****************************************************/
    3. #pragma once
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. using namespace std;
    10. // 备忘录类-游戏进度
    11. class Memento
    12. {
    13. public:
    14. // 构造函数
    15. Memento(string state) : m_state(state) {}
    16. // 获取状态
    17. std::string getState() const {
    18. return m_state;
    19. }
    20. private:
    21. std::string m_state;
    22. };
    23. // 发起类-游戏
    24. class Game
    25. {
    26. public:
    27. // 设置状态
    28. void setState(string state) {
    29. m_state = state;
    30. }
    31. // 获取状态
    32. string getState() {
    33. return m_state;
    34. }
    35. // 保存状态至备忘录
    36. Memento saveStateToMemento() {
    37. return Memento(m_state);
    38. }
    39. // 从备忘录获取状态
    40. void getStateFromMemento(const Memento& memento) {
    41. m_state = memento.getState();
    42. }
    43. private:
    44. std::string m_state;
    45. };
    46. // 备忘录管理类-进度管理
    47. class CareTaker
    48. {
    49. public:
    50. // 添加备忘录
    51. void addMemento(const Memento& memento) {
    52. m_mementos.push_back(memento);
    53. }
    54. // 获取备忘录
    55. Memento getMemento(int index) {
    56. return m_mementos[index];
    57. }
    58. private:
    59. std::vector m_mementos;
    60. };
    61. int main()
    62. {
    63. Game game;
    64. CareTaker careTaker;
    65. // 通关
    66. game.setState("进度:第一关通过");
    67. game.setState("进度:第二关通过");
    68. // 保存进度,进度被管理系统管理
    69. careTaker.addMemento(game.saveStateToMemento());
    70. // 继续通关
    71. game.setState("进度:第三关通过");
    72. // 保存进度,进度被管理系统管理
    73. careTaker.addMemento(game.saveStateToMemento());
    74. // 继续通关
    75. game.setState("进度:第四关通过");
    76. // 当前进度
    77. cout << "当前" << game.getState() << endl;
    78. // 获取首个进度
    79. game.getStateFromMemento(careTaker.getMemento(0));
    80. cout << "1)" << game.getState() << endl;
    81. // 获取第二个进度
    82. game.getStateFromMemento(careTaker.getMemento(1));
    83. cout << "2)" << game.getState() << endl;
    84. return 0;
    85. }

    4.优缺点

    优点:

    1. 良好封装性。发起人对象中的内部状态被保存在备忘录中,也只能由自己读取,对其他对象起到了屏蔽作用。
    2. 提供了状态恢复机制。类似于游戏存档读档。
    3. 简化了发起人职责。发起人状态的存储和获取,被分离出去了。

    缺点:

    资源消耗较大,对发起人对象不同内部状态的存储,会导致开销增加。

    引用

    设计模式之备忘录模式(C++)_c++ 备忘录模式-CSDN博客

    C++ 设计模式之备忘录模式 - 一杯清酒邀明月 - 博客园 (cnblogs.com)

     

  • 相关阅读:
    109 使用Ajax传递请求本地数据库
    操作系统与shell
    聊聊编程中的 “魔数”
    NDK编译脚本:Android.mk or CMakeLists.txt
    AI基于大模型语言存在的网络安全风险
    汽车标定技术(四)--问题分析:多周期测量时上位机显示异常
    java+springboot+vue水果蔬菜篮子商城经营平台系统
    C. Balanced Bitstring(思维+子字符串规律)
    【BOOST C++ 5 】通信(05 windows相关的对象 )
    B站:李宏毅2020机器学习笔记 5 —— 分类器Classification
  • 原文地址:https://blog.csdn.net/Physics_ITBoy/article/details/133637718