• 【Python笔记-设计模式】备忘录模式


    一、说明

    备忘录模式是一种行为设计模式,允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

    (一) 解决问题

    主要解决在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要时恢复对象到之前的状态。

    (二) 使用场景

    • 撤销操作、历史记录、快照等
    • 需要保持对象的封装性,不希望暴露其内部状态的细节给外部时

    二、结构

    1. 原发器(Originator)类可以生成自身状态的快照,也可以在需要时通过快照恢复自身状态。
    2. 备忘录(Memento)是原发器状态快照的值对象(valueobject)。通常做法是将备忘录设为不可变的,并通过构造函数一次性传递数据。
    3. 负责人(Caretaker)仅知道“何时”和“为何”捕捉原发器的状态,以及何时恢复状态。负责人通过保存备忘录栈来记录原发器的历史状态。当原发器需要回溯历史状态时,负责人将从栈中获取最顶部的备忘录,并将其传递给原发器的恢复(restoration)方法。
    4. 在该实现方法中,备忘录类将被嵌套在原发器中。这样原发器就可访问备忘录的成员变量和方法,即使这些方法被声明为私有。另一方面,负责人对于备忘录的成员变量和方法的访问权限非常有限:它们只能在栈中保存备忘录,而不能修改其状态。

    三、伪代码

    1. #!/usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. __doc__ = """
    4. 备忘录模式
    5. 例:假设有一个文本编辑器应用程序,用户可以在其中编辑文本,并且可以撤销和恢复操作
    6. """
    7. class Memento:
    8. """备忘录(Memento)"""
    9. def __init__(self, content):
    10. self._content = content
    11. def get_content(self):
    12. return self._content
    13. class Originator:
    14. """原发器(Originator)"""
    15. def __init__(self):
    16. self._content = ""
    17. def type(self, text):
    18. self._content += text
    19. def get_content(self):
    20. return self._content
    21. def create_memento(self):
    22. return Memento(self._content)
    23. def restore_from_memento(self, memento):
    24. self._content = memento.get_content()
    25. class Caretaker:
    26. """负责人(Caretaker)"""
    27. def __init__(self):
    28. self._mementos = []
    29. def add_memento(self, memento):
    30. print(f"当前内容: {memento.get_content()}")
    31. self._mementos.append(memento)
    32. def get_memento(self, index):
    33. print("撤销到指定步骤")
    34. return self._mementos[index]
    35. if __name__ == "__main__":
    36. """
    37. 当前内容: Hello,
    38. 当前内容: Hello, world!
    39. 撤销到指定步骤
    40. 当前内容: Hello,
    41. """
    42. originator = Originator()
    43. caretaker = Caretaker()
    44. # 用户开始编辑文本
    45. originator.type("Hello, ")
    46. memento1 = originator.create_memento()
    47. caretaker.add_memento(memento1)
    48. # 用户继续编辑文本
    49. originator.type("world!")
    50. memento2 = originator.create_memento()
    51. caretaker.add_memento(memento2)
    52. # 用户撤销操作
    53. memento = caretaker.get_memento(0)
    54. originator.restore_from_memento(memento)
    55. print(f"当前内容: {memento.get_content()}")

    四、优缺点

    优点

    • 封装性好:备忘录模式可以有效地封装对象的状态,不暴露其内部细节,符合面向对象设计的封装原则。
    • 简化原始对象:备忘录模式可以将对象的状态保存在备忘录对象中,从而简化了原始对象的结构,使其更加清晰和易于维护。

    缺点

    • 性能影响:频繁保存和恢复对象状态可能会影响程序的性能,特别是在状态较大或者对象较复杂的情况下。
    • 实现复杂度高:备忘录模式的实现可能较为复杂,特别是涉及到多个对象状态的保存和恢复时。

    【Python笔记】设计模式-CSDN博客

  • 相关阅读:
    MessagePack 和System.Text.Json 序列化和反序列化对比
    环境编程代码实例:“加/卸载” Zend Framework 2
    vite + electron引入itk报错
    BERT(Bidirectional Encoder Representations from Transformers)
    vue2组件之间传值方式,父子,子父,兄弟,v-model ,provide和inject,$parent和$children
    Serilog日志框架
    react+taro的复制功能
    设计模式-观察者模式在Java中的使用示例-环境监测系统
    【控制台】 \xce\xde\xb7\xa8\xb4\xf2\xbf\xaa
    【论文笔记】policy-space response oracles (PSRO)
  • 原文地址:https://blog.csdn.net/weixin_44904331/article/details/136329240