备忘录模式概述
- 备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态
- 这样以后就可将该对象恢复到原先保存的状态。这种类型的设计模式属于行为模式
- 在备忘录模式中,主要涉及三种角色:
- 发起人 (Originator)角色
- 记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
- 发起人可以根据需要决定备忘录存储发起人的哪些状态
- 备忘录 (Memento)角色
- 负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录
- 备忘录有两个接口,一是提供它所能保存的发起人内部状态,二是将这些状态恢复到发起人对象中
- 管理者 (Caretaker)角色
- 负责保存好备忘录,不能对备忘录的内容进行操作或检查
- 发起人 (Originator)角色
备忘录模式应用
ts
// 原始类(Originator)定义
class Originator {
private state: string; // 内部状态
constructor(state: string) {
this.state = state;
}
// 创建备忘录方法,返回备忘录对象
createMemento(): Memento {
return new Memento(this.state);
}
// 设置内部状态方法,可以通过备忘录恢复状态
setMemento(memento: Memento) {
this.state = memento.getState();
}
// 其他业务逻辑,改变内部状态
setState(newState: string) {
this.state = newState;
console.log(`State changed to: ${this.state}`);
}
// 获取当前状态
getState(): string {
return this.state;
}
}
// 备忘录接口和实现
interface Memento {
getState(): string;
}
class ConcreteMemento implements Memento {
private _state: string;
constructor(state: string) {
this._state = state;
}
getState(): string {
return this._state;
}
}
// 管理者角色(Caretaker)负责保管备忘录,但不关心备忘录的具体内容
class Caretaker {
private _mementos: Memento[] = [];
// 添加备忘录
addMemento(memento: Memento) {
this._mementos.push(memento);
}
// 获取备忘录,通常由原始类调用
getMemento(index: number): Memento | undefined {
return this._mementos[index];
}
}
// 示例用法
const originator = new Originator("Initial State");
console.log("Original state:", originator.getState());
// 创建一个备忘录并保存状态
const caretaker = new Caretaker();
caretaker.addMemento(originator.createMemento());
// 改变原始类的状态
originator.setState("New State");
console.log("Changed state:", originator.getState());
// 通过备忘录恢复状态
if (caretaker.getMemento(0)) {
originator.setMemento(caretaker.getMemento(0)!);
console.log("Restored state:", originator.getState());
}
- 在这个例子中:
Originator
类代表了一个包含内部状态的对象,它定义了如何创建 (createMemento
) 和恢复 (setMemento
) 备忘录。 Memento
是一个接口,代表备忘录对象,它包含了对内部状态的引用,但对外部世界隐藏了这些状态的具体内容。ConcreteMemento
类实现了这个接口,存储了实际的状态值。Caretaker
类扮演管理者角色,它可以接收备忘录并存储它们,但它并不知道如何解读备忘录的内容。当需要时,它把备忘录交还给Originator
进行状态恢复。- 通过这种模式,我们可以安全地保存和恢复
Originator
的内部状态,同时保持了良好的封装性
备忘录模式的优缺点
1 )优点
- 它提供了一种可以撤销操作的机制
- 封装了内部状态,并通过对外部提供的接口来恢复内部状态
2 ) 缺点
- 如果发起人状态很大或者很多,那么存储起来可能会消耗很大的内存
- 可能会存在很多备忘录对象,消耗内存
- 在实际应用中,备忘录模式通常用于实现诸如"撤销"这样的功能,例如文本编辑器中的撤销操作
- 通过保存用户每次编辑操作的状态,可以方便地撤销到之前的状态