Java设计模式——备忘录模式
⚪备忘录模式(Memento)是一种行为型设计模式,
⚪意图:它允许在不暴露对象内部状态的情况下捕获对象的状态,并将状态保存在外部对象中,以便在以后恢复对象到先前的状态。
⚪以下是工厂方法模式的关键要点:
▷ 角色和责任:
- 发起人(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;
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
// 管理者类
class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
public class MementoPatternExample {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
// 设置发起人的状态
originator.setState("状态1");
// 保存状态
caretaker.setMemento(originator.saveStateToMemento());
// 修改状态
originator.setState("状态2");
// 恢复到之前的状态
originator.getStateFromMemento(caretaker.getMemento());
System.out.println("当前状态: " + originator.getState()); // 输出:当前状态: 状态1
}
}
⚪适用性
- 必须保存一个对象在某一个时刻的(部分) 状态,这样以后需要时它才能恢复到先前的状态。
- 如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
⚪应用场景
- 撤销功能:备忘录模式常用于实现撤销操作。例如,文本编辑器可以使用备忘录来保存文本编辑器的历史状态,用户可以撤销到先前的编辑状态。
- 版本控制系统:版本控制系统(如Git)使用备忘录模式来跟踪文件和代码库的历史状态。
- 数据库事务管理:数据库管理系统可以使用备忘录来实现事务的回滚(Rollback)操作,以便在发生错误时恢复到之前的一致状态。
- 游戏状态管理:在游戏开发中,备忘录模式可用于保存游戏状态,以支持玩家保存游戏进度或回到先前的游戏状态。
⚪实际已有场景
- 版本控制系统:在 Java 中,Git 和其他版本控制系统的实现通常使用备忘录模式来管理源代码库的历史状态。
- Spring事务管理:Spring框架中的事务管理机制可以看作是备忘录模式的一种应用。Spring会在事务开始之前保存数据库的状态,如果事务失败或回滚,它将恢复数据库到事务开始前的状态。
- Spring Web应用的状态管理:在Web应用中,Spring的Session管理可以使用备忘录模式来保存和恢复用户会话的状态。这对于支持“回到之前的状态”功能非常有用。
- Spring状态机:Spring状态机(Spring State Machine)是一个用于管理有限状态机的框架,它允许定义状态和状态转换。备忘录模式可以用于保存和恢复状态机的状态。

浙公网安备 33010602011771号