备忘录模式

模式描述

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便于恢复到原先保存的状态。

优点

  1. 备忘录只能由 Originator 来创建,保护封装边界;
  2. 简化了 Originator;

缺点

  1. 使用备忘录代价可能很高;
  2. 一些语言难以保证只有 Originator 访问 Memento;
  3. 维护 Memento 有潜在代价;

应用场景

  1. 需要保存一个对象的状态,便于恢复到原先保存的状态;
  2. 放丢失、撤销和恢复;
DATE CHANGELOG
2023年5月7日 初始化

UML 类图

classDiagram
class Originator {
	State state
	setMemento(Memento memento)
	createMemento() Memento
}

class Memento {
	State state
	getState()
	setState()
}

Originator <-- Memento

class Caretaker {
	
}
Caretaker o-- Memento

Originator <-- Client
Caretaker <-- Client

参与者

Memento

  • 保存 Originator 中的内部状态;
  • 防止 Originator 意外的其他对象访问;

Originator

  • 用来创建一个 Memento;
  • 用来恢复内部状态;

Caretaker

  • 负责保存 Memento;

Client 类

客户端。

数据流

  1. Client 创建一个 Memento,并使用 Originator 保存到 Caretaker 中;

相关模式

  • 命令模式:可以使用备忘录来为可撤销的操作维护状态;
  • 迭代模式:备忘录模式可用于迭代;

补充

  • 备忘录模式更侧重于代码的设计和实现,备份更侧重架构设计或产品设计;
  • 大对象的备份可能只备份必要的恢复信息,结合最新的数据来恢复;或者,使用全量备份和增量备份相结合,低频全量备份,高频增量备份,两者结合来做恢复;

示例代码

golang

java