备忘录
备忘录设计模式(Memento Design 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 saveStateToMemento() {
return new Memento(state);
}
// 从备忘录恢复状态
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
// 管理者类
class Caretaker {
private List<Memento> mementoList = new ArrayList<>();
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");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #2");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #3");
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());
}
}
应用场景
需要保存和恢复对象的状态时:如文本编辑器的撤销功能。
需要实现事务操作时:如数据库的回滚操作。
避免过多的数据库存储:在应用中频繁保存对象状态。
优缺点
优点:
封装性强: 备忘录将对象的状态封装起来,外界无法直接访问它的内容。
易于恢复: 可以轻松恢复对象的历史状态。
缺点:
占用资源: 如果需要存储的状态很多,会占用大量内存。
复杂性增加: 需要引入额外的类(备忘录、管理者)。

备忘录模式常用于开发需要“后悔药”功能的应用,如撤销、回滚等功能,是一种设计优雅且实用的模式。
Last updated