这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
备忘录模式
是一种行为设计模式,在不破坏封装性的前提下,能够保存对象的内部状态,并且支持对对象状态的恢复。该模式也叫做快照模式
模式结构
- 发起人:主要为记录备忘录内部状态信息,访问备忘录内的所有信息,提供创建备忘录和恢复备忘录数据的功能
- 备忘录:负责存储发起人的内部状态,发起人可从备忘录中获取内部状态
- 负责人:对备忘录管理,提供保存和获取备忘录功能,但无法对备忘录内容进行访问和修改
// 抽象备忘录
interface Memento {
getState(): string;
getName(): string;
getDate(): string;
}
// 具体备忘录实现
class ConMemento implements Memento {
private date: string;
constructor(private state: string) {
this.state = state
this.date = new Date().toString();
}
getState(): string {
return this.state;
}
getName(): string {
return `${this.date} ---${this.state}`;
}
getDate(): string {
return this.date;
}
}
// 发起人,记录备忘录内部状态信
class Originator {
private state;
constructor(state: string){
this.state = state
}
getMemento() {
return new ConMemento(this.state);
}
// 修改备忘录的内部状态
dealOperater(m: Memento) {
this.state = m.getDate();
}
}
// 负责人, 将负责对备忘录对象的保存和获取,无法对备忘录内部进行修改
class CareTeaker {
private memento: ConMemento;
set setMemento(memento: ConMemento) {
this.memento = memento;
}
get getMemento() {
return this.memento
}
}
主要优点
- 提供一个可恢复状态的机制,方便用户恢复到历史状态
- 实现内部状态的封装,仅发起人可访问,其他对象都无法访问
- 负责人管理备忘录的状态保存,发起人无需关注,符合单一职责原则
主要缺点
- 资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
适用场景
- 当需要创建对象状态快照来恢复其之前的状态时,即需要保存和恢复数据的场景,如游戏中的存档功能
- 某些需要回滚的场景,因为备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态