定义
备忘录设计模式是一种行为型设计模式,用于在不破坏封装性的情况下捕获和恢复一个对象的内部状态。它允许将对象的状态保存到备忘录对象中,并在需要时从备忘录中恢复对象的状态。
参与者:
- 状态(State):封装了状态信息的对象。
- 备忘录(Memento):用于存储发起人对象的状态。
- 管理者(Caretaker):负责管理备忘录对象,但不对其内容进行修改。
- 发起人(Originator):拥有要保存状态的对象,并能够创建和恢复备忘录。
基本流程:
- 创建一个发起人对象和一个管理者对象。
- 初始化发起人对象状态,将初始状态包装成备忘录对象交给管理者对象保管。
- 修改发起人对象状态,将修改之后的状态包装成备忘录对象交给管理者对象保管。
- 如果需要将发起人恢复到之前的某个状态(切换快照),则先从管理者对象中取出对应的备忘录对象并传递给发起人,发起人从中提取状态并恢复。
优点:
- 提供了一种轻松且有效地保存和恢复对象状态的方式,而无需暴露对象的实现细节。
- 允许在不破坏封装性的情况下捕获和恢复对象状态。
- 支持撤销和重做操作,以及实现回滚机制。
缺点:
- 备忘录对象可能占用较大的内存空间,特别是当需要保存的状态较多时。
- 发起人对象的封装性可能会受到破坏,因为它需要将部分或全部状态暴露给备忘录对象。
举例:
// 状态
class State {
constructor(public data: string) {}
}
// 备忘录:用来包装状态实例对象
class Memento {
constructor(public state: State | null) {}
getState() {
return this.state;
}
}
// 管理者:存储或者取出某个备忘录对象
class Caretaker {
mementos: Memento[] = [];
// 存储
addMemento(memento: Memento) {
this.mementos.push(memento);
}
// 取出
getMemento(index: number) {
return this.mementos[index];
}
}
// 发起人
class Originator {
state: State | null = null;
// 初始化/切换当前状态的方法
setState(state: State) {
this.state = state;
}
// 根据当前状态生成一个备忘录对象
createMemento() {
return new Memento(this.state);
}
// 将当前状态恢复到某个快照时刻
restoreFromMemento(memento: Memento) {
this.state = memento.getState();
}
}
// 创建发起人对象和管理者对象
const originator = new Originator();
const caretaker = new Caretaker();
// 设置发起人对象的初始状态并包装成备忘录对象然后保存到管理者中
originator.setState(new State("State 1"));
caretaker.addMemento(originator.createMemento());
// 修改发起人对象的状态并将修改状态包装并保存
originator.setState(new State("State 2"));
caretaker.addMemento(originator.createMemento());
// 从管理者中拿出某个备忘录并将其中的状态恢复到发起者
originator.restoreFromMemento(caretaker.getMemento(0));
console.log(originator.state); // >>> State {data: 'State 1'}
业务场景:
- 状态管理:在前端应用中,可以使用备忘录模式来管理用户界面的状态。例如,当用户与应用进行交互时,可以将特定时刻的界面状态保存到备忘录对象中,以便在需要时进行恢复或回滚。
- 撤销和重做功能:备忘录模式可用于实现撤销和重做操作。通过在每个操作之前创建并保存对象的备忘录,可以在需要撤销操作时还原对象的状态,或者在需要重做操作时重新应用之前的备忘录。
- 编辑器功能:在文本编辑器、图形编辑器等应用中,备忘录模式可以用于保存编辑器的历史状态。这样就可以实现撤销和重做操作,并允许用户查看和返回到先前的编辑状态。
- 缓存管理:备忘录模式可以用于缓存管理,尤其在需要缓存多个不同状态的情况下。通过将对象状态保存到备忘录中,可以更轻松地管理和维护多个缓存状态,并在需要时进行恢复和使用。
总结
备忘录设计模式通过管理者管理被备忘录封装起来的各个状态对象,方便发起人随时存储当前状态或者切换至历史上的某个状态。适用于一切需要保存历史状态的场景。