Design 备忘录模式
基本介绍
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。
备忘录模式属于行为型模式。
特点:不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
案例图示
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
优缺点
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
- 实现了信息的封装,使得用户不需要关心状态的保存细节
缺点:
- 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
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实现备忘录模式:
...