1. 基本概念
备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象实现的情况下捕获对象的内部状态并在对象之外保存这个状态,以便稍后可以将其还原到先前的状态。
2. 基本结构
备忘录模式包括以下几个重要角色:
- 发起人
Originator
: 需要还原状态的那个对象,负责创建一个【备忘录】,并使用备忘录记录当前时刻的内部状态。
- 备忘录
Memento
: 存储发起人对象的内部状态,它可以包含发起人的部分或全部状态信息,但是对外部是不可见的,只有发起人能够访问备忘录对象的状态。
备忘录有两个接口,发起人能够通过宽接口访问数据,管理者只能看到窄接口,并将备忘录传递给其他对象。
- 管理者
Caretaker
: 负责存储备忘录对象,但并不了解其内部结构,管理者可以存储多个备忘录对象。
- 客户端:在需要恢复状态时,客户端可以从管理者那里获取备忘录对象,并将其传递给发起人进行状态的恢复。
3. 基本实现
- 创建发起人类:可以创建备忘录对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Originator { private String state;
public void setState(String state) { this.state = state; } public String getState() { return state; } public Memento createMemento() { return new Memento(state); } public void restoreFromMemento(Memento memento) { state = memento.getState(); } }
|
- 创建备忘录类:保存发起人对象的状态
1 2 3 4 5 6 7 8 9 10 11 12
| class Memento { private String state; public Memento(String state) { this.state = state; } public String getState() { return state; } }
|
- 创建管理者:维护一组备忘录对象
1 2 3 4 5 6 7 8 9 10 11
| class Caretaker { private List<Memento> mementos = new ArrayList<>();
public void addMemento(Memento memento) { mementos.add(memento); }
public Memento getMemento(int index) { return mementos.get(index); } }
|
- 客户端使用备忘录模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class Main { public static void main(String[] args) { Originator originator = new Originator(); originator.setState("State 1");
Caretaker caretaker = new Caretaker();
caretaker.addMemento(originator.createMemento());
originator.setState("State 2");
caretaker.addMemento(originator.createMemento());
originator.restoreFromMemento(caretaker.getMemento(0));
System.out.println("Current State: " + originator.getState()); } }
|
4. 使用场景
备忘录模式在保证了对象内部状态的封装和私有性前提下可以轻松地添加新的备忘录和发起人,实现“备份”,不过 备份对象往往会消耗较多的内存,资源消耗增加。
备忘录模式常常用来实现撤销和重做功能,比如在Java Swing GUI编程中,javax.swing.undo
包中的撤销(undo)和重做(redo)机制使用了备忘录模式。UndoManager
和UndoableEdit
接口是与备忘录模式相关的主要类和接口。