备忘录模式(Memento Pattern)是一种行为型设计模式,旨在在不破坏封装性的前提下捕获对象的内部状态,并在需要时恢复到之前的状态。它主要用于保存和恢复对象的状态,常用于实现撤销操作或版本管理。
模式结构
备忘录模式包含以下三个主要角色:
- Originator(发起人)
定义一个对象,它的状态需要被保存和恢复。
提供创建备忘录(保存状态)和恢复备忘录(还原状态)的方法。 - Memento(备忘录)
存储发起人的内部状态。
通常是一个不透明对象,只有发起人能够访问其内容。 - Caretaker(负责人)
负责保存备忘录,但不能修改或访问备忘录的内容。
代码示例
// 备忘录类
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
// 发起人类
class Originator {
private String state;
public void setState(String state) {
this.state = state;
System.out.println("State set to: " + state);
}
public String getState() {
return state;
}
public Memento createMemento() {
return new Memento(state);
}
public void setMemento(Memento memento) {
state = memento.getState();
System.out.println("State restored to: " + state);
}
}
// 负责人类
class Caretaker {
private List<Memento> mementoList = new ArrayList<>();
public void addMemento(Memento memento) {
mementoList.add(memento);
}
public Memento getMemento(int index) {
return mementoList.get(index);
}
}
// 测试代码
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("State1");
caretaker.addMemento(originator.createMemento());
originator.setState("State2");
caretaker.addMemento(originator.createMemento());
originator.setState("State3");
System.out.println("Current state: " + originator.getState());
// 恢复状态
originator.setMemento(caretaker.getMemento(0));
System.out.println("Restored state: " + originator.getState());
}
}
适用场景
- 需要保存和恢复对象的状态。
- 实现撤销操作功能。
- 需要保存对象的历史版本。
优缺点
- 优点
提供了对象状态的快照功能。
保持了对象的封装性。 - 缺点
如果需要保存的状态非常复杂,会消耗较多内存。
负责人类需要管理多个备忘录,可能引入管理复杂性。