备忘录模式
1 概述
- 备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装的前提下捕获和恢复对象的内部状态。备忘录模式通过存储对象在某个时刻的状态,使得对象可以在以后恢复到该状态。
- 这种模式通过引入备忘录对象来存储状态,从而使得对象的状态恢复变得更加容易和灵活。
2 优缺点及应用场景
2.1 优点
- 1)状态恢复:可以方便地恢复对象到之前的某个状态。
- 2)封装性:保持了对象的封装性,外部对象不需要了解对象的内部状态。
- 3)简化了撤销操作:可以通过备忘录模式实现撤销功能。
2.2 缺点
- 1)增加内存开销:存储对象的状态会消耗较多的内存,特别是在对象状态较多或较复杂时。
- 2)实现复杂:需要管理好备忘录对象的创建和恢复操作,增加了系统的复杂性。
2.3 应用场景
- 1)数据库事务管理:通过事务日志保存状态,实现回滚。
- 2)需要保存和恢复对象状态:需要在某个时刻保存对象的状态,并在以后恢复的场景。
- 3)实现撤销功能:可以通过备忘录模式实现系统的撤销功能。
- 4)需要对外隐藏对象的内部状态:需要保持对象的封装性,对外隐藏对象的内部状态的场景。
3 结构
- 1)发起人(Originator):创建一个备忘录,记录当前时刻的内部状态,并可使用备忘录恢复内部状态。
- 2)备忘录(Memento):存储发起人的内部状态,并可以防止除发起人以外的其他对象访问备忘录。
- 3)负责人(Caretaker):负责保存备忘录,不能对备忘录的内容进行操作或检查。
4 实现
4.1 UML 类图

4.2 代码示例
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;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento Memento) {
state = Memento.getState();
}
}
class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(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("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
Current State: State #4
First saved State: State #2
Second saved State: State #3
5 总结
- 备忘录模式通过在不破坏封装的前提下捕获和恢复对象的内部状态,实现了状态的恢复和撤销功能。备忘录模式适用于需要保存和恢复对象状态、实现撤销功能以及需要对外隐藏对象内部状态的场景。尽管备忘录模式增加了内存开销和系统复杂性,但它在状态恢复和保持对象封装性方面具有显著优势。在实际应用中,需要根据具体需求合理使用备忘录模式,以实现灵活可扩展的系统设计。