Design 备忘录模式

基本介绍

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。

备忘录模式属于行为型模式。

特点:不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

案例图示

备忘录模式使用三个类 MementoOriginatorCareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。

备忘录模式的 UML 图

优缺点

优点:

  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  • 实现了信息的封装,使得用户不需要关心状态的保存细节

缺点:

  • 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存

Python实现

用Python实现备忘录模式,并未严格按照规范:

#! /usr/local/bin/python3
# -*- coding:utf-8 -*-

import copy


class AddNumber:

    def __init__(self):
        self.start = 1

    def add(self, number):
        self.start += number
        print(self.start)


class Memento:
    """备忘录"""

    def backups(self, obj=None):
        """
        设置备份方法
        :param obj:
        :return:
        """
        self.obj_dict = copy.deepcopy(obj.__dict__)
        print("备份数据:{}".format(self.obj_dict))

    def recovery(self, obj):
        """
        恢复备份方法
        :param obj:
        :return:
        """
        obj.__dict__.clear()
        obj.__dict__.update(self.obj_dict)
        return obj


if __name__ == '__main__':
    test = AddNumber()
    memento = Memento()

    for i in [1, 2, 3, 'n', 4]:
        if i == 2:
            memento.backups(test)
        try:
            test.add(i)
        except TypeError as e:
            print(e)
            print(test.start)
    memento.recovery(test)
    print(test.start)

结果如下:

2
备份数据:{'start': 2}
4
7
unsupported operand type(s) for +=: 'int' and 'str'
7
11
2

Golang实现

用Golang实现备忘录模式:

...
posted @ 2021-04-14 15:08  云崖君  阅读(53)  评论(0编辑  收藏  举报