20、设计模式Python版-备忘录模式

基本介绍

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

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

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

案例图示

游戏有存档和删档的功能,当我们进行到某一关时便可对游戏进行存档,下次进入游戏后按照上次的存档位置继续游戏:

 

优缺点

优点:

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

缺点:

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

代码实现

用Python实现备忘录模式:

import copy
class AddNumber:

    def __init__(self):
        self.start = 0

    def add(self, number):
        self.start = number
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)
        print("恢复数据:{}".format(self.obj_dict))
        return obj
if __name__ == '__main__':
    test = AddNumber()
    memento = Memento()

    for i in [1, 2, 3, 4, 5]:
        if i == 2:
            memento.backups(test)
        test.add(i)
    print("当前数据:{}".format(test.start))
    memento.recovery(test)
    print(test.start)

# 备份数据:{'start': 1}
# 当前数据:5
# 恢复数据:{'start': 1}
# 1