目录
[1. 概念](#1. 概念)
前言
备忘录模式是一种行为型设计模式,用于在不破坏封装性的情况下保存和恢复对象的状态。它包含源发器、备忘录和****管理者三个角色。
该模式常用于撤销操作,如文本编辑器的撤销功能和数据库事务管理。
备忘录模式虽然有内存占用和性能开销的缺点,但在需要状态管理的场景中十分有用。
设计模式分类如下:

1. 概念
1.1、定义
备忘录模式(Memento Pattern))用于在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在需要时恢复这个状态(如撤销操作)。
即允许对象把当前状态保存到外部对象中。以后可将其恢复。
1.2、适用场景
1、需要保存和恢复数据场景(如撤销、历史快照、存档、游戏进度、表单编辑器等)。
2、不希望外部对象随意访问对象内部细节,但需要保存和恢复快照。
2、角色划分
如下图所示:

- Originator(发起人/原发器):拥有内部状态,需要保存和恢复
- Memento(备忘录):保存Originator的状态
- Caretaker(管理者/看护者):保存并管理备忘录,但不能操作备忘录内部实现内容
3、实现
1、Originator(发起人)
java
class Editor {
private String text;
public void setText(String text) { this.text = text; }
public String getText() { return text; }
public Memento save() { return new Memento(text); }
public void restore(Memento m) { this.text = m.getText(); }
}
2、Memento(备忘录)
java
class Memento {
private final String text;
public Memento(String text) { this.text = text; }
public String getText() { return text; }
}
3、Caretaker(管理者)
java
import java.util.Stack;
class Caretaker {
private Stack<Memento> history = new Stack<>();
public void add(Memento m) { history.push(m); }
public Memento undo() {
if (!history.isEmpty()) return history.pop();
return null;
}
}
4、使用示例
java
public class Main {
public static void main(String[] args) {
Editor editor = new Editor();
Caretaker caretaker = new Caretaker();
editor.setText("第一版");
caretaker.add(editor.save());
editor.setText("第二版");
caretaker.add(editor.save());
editor.setText("第三版");
// 撤销到第二版
editor.restore(caretaker.undo());
System.out.println(editor.getText()); // 输出 第二版
// 再撤销
editor.restore(caretaker.undo());
System.out.println(editor.getText()); // 输出 第一版
}
}
4、优缺点
4.1、优点
1、状态保存与恢复:
备忘录模式可以帮助我们保存对象的状态,并在需要时恢复到之前的状态。这在某些情况下非常有用,比如撤销操作或者程序崩溃后的恢复。
2、封装性和隔离性:
可以确保对象的状态保存在备忘录对象中,而不会暴露给其他对象。这为对象的封装性和隔离性提供了保护,使得对象的状态变化对其他对象是透明的。
4.2、缺点
1、内存占用:
可能引起较大的内存占用,特别是当对象的状态较多且状态改变频繁时。每个备忘录对象都需要保存一份完整的状态,如果状态较多或者备忘录对象较多,可能会消耗大量内存。
2、性能开销:
备忘录模式涉及到创建、存储和恢复状态的操作,这些操作可能引起一定的性能开销。特别是在状态较大或者对象较复杂的情况下,备忘录模式的性能可能会受到影响。
总结:

参考文章: