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

一、说明

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

(一) 解决问题

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

(二) 使用场景

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

二、结构

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

三、伪代码

python 复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
备忘录模式

例:假设有一个文本编辑器应用程序,用户可以在其中编辑文本,并且可以撤销和恢复操作
"""


class Memento:
    """备忘录(Memento)"""

    def __init__(self, content):
        self._content = content

    def get_content(self):
        return self._content


class Originator:
    """原发器(Originator)"""

    def __init__(self):
        self._content = ""

    def type(self, text):
        self._content += text

    def get_content(self):
        return self._content

    def create_memento(self):
        return Memento(self._content)

    def restore_from_memento(self, memento):
        self._content = memento.get_content()


class Caretaker:
    """负责人(Caretaker)"""

    def __init__(self):
        self._mementos = []

    def add_memento(self, memento):
        print(f"当前内容: {memento.get_content()}")
        self._mementos.append(memento)

    def get_memento(self, index):
        print("撤销到指定步骤")
        return self._mementos[index]


if __name__ == "__main__":
    """
        当前内容: Hello, 
        当前内容: Hello, world!
        撤销到指定步骤
        当前内容: Hello, 
    """
    originator = Originator()
    caretaker = Caretaker()

    # 用户开始编辑文本
    originator.type("Hello, ")
    memento1 = originator.create_memento()
    caretaker.add_memento(memento1)

    # 用户继续编辑文本
    originator.type("world!")
    memento2 = originator.create_memento()
    caretaker.add_memento(memento2)

    # 用户撤销操作
    memento = caretaker.get_memento(0)
    originator.restore_from_memento(memento)

    print(f"当前内容: {memento.get_content()}")

四、优缺点

优点

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

缺点

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

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

相关推荐
博风6 天前
设计模式:25、备忘录模式(标记)
设计模式·备忘录模式
岳轩子11 天前
23种设计模式之备忘录模式
windows·设计模式·备忘录模式
morning_judger21 天前
【设计模式系列】备忘录模式(十九)
java·设计模式·备忘录模式
小白不太白9501 个月前
设计模式之 备忘录模式
服务器·设计模式·备忘录模式
萨达大1 个月前
23种设计模式-备忘录(Memento)设计模式
java·c++·设计模式·软考·备忘录模式·软件设计师·行为型设计模式
G皮T1 个月前
【设计模式】行为型模式(四):备忘录模式、中介者模式
java·设计模式·中介者模式·备忘录模式·memento·mediator
zzzhpzhpzzz2 个月前
设计模式——备忘录模式
设计模式·备忘录模式
2401_856654512 个月前
这TOP3免费录屏软件,助你轻松跃升视频制作小能手
编辑器·音视频·视频编解码·视频·备忘录模式
tuodianke2 个月前
Windows电脑桌面如何弄个好用的提醒备忘录?
笔记·科技·职场发展·软件需求·备忘录模式
麦克·唐2 个月前
命令模式和备忘录模式实现undo、redo(C++)
c++·命令模式·备忘录模式