备忘录模式
介绍
- 备忘录模式是一种行为设计模式
- 允许在不破坏对象封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
- 需要保证被保存的对象状态不能被外部访问,保证内部完整性,不向外透露
核心思想
- 在不破坏对象封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便恢复到原先保存的某个状态。
备忘录角色
- 发起人(Originator)- 负责创建一个含有当前的内部状态的备忘录对象,并保存到备忘录中
- 备忘录(Memento)- 负责存储发起人内部状态的快照,而且可以保护这些内容不被发起人对象之外的任何对象读取
- 管理者(Caretaker)- 负责维护发起人保存的一个或多个备忘录,并在需要回滚状态的时候提供保存了相应状态的备忘录,但不能对备忘录进行操作
使用场景
- 需要实现撤销、恢复操作的场景(例如编辑器软件撤销功能)
- 需要保存、恢复数据的相关状态场景(文件、游戏存档等)
- 需要做一些回滚操作时(路由回退、浏览器历史记录等)
优点
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
- 实现信息的封装,用户不需要关心状态的保存细节
缺点
- 消耗资源 - 如果类的成员变量过多,会占用比较大的资源,而且每一次保存都会消耗一定的内存
- 若遇到数据量大时可能还会影响程序性能下降,因为备忘录每次保存都是在消耗内存
代码实现
class Memento {
constructor(state) {
this.state = state;
}
getState() {
return this.state;
}
}
class Originator {
constructor() {
this.state = '';
}
setState(state) {
this.state = state;
}
getState() {
return this.state;
}
saveStateToMemento() {
return new Memento(this.state);
}
getStateFromMemento(memento) {
this.state = memento.getState();
}
}
class CareTaker {
constructor() {
this.mementos = [];
}
addMemento(memento) {
this.mementos.push(memento);
}
getMemento(index) {
return this.mementos[index];
}
}
const originator = new Originator();
const careTaker = new CareTaker();
originator.setState('第一次的状态');
careTaker.addMemento(originator.saveStateToMemento());
originator.setState('第二次的状态');
careTaker.addMemento(originator.saveStateToMemento());
originator.getStateFromMemento(careTaker.getMemento(0));
console.log(originator.getState());