TypeScript | 设计模式19 -备忘录模式

299 阅读2分钟

这是我参与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
  }
}

主要优点

  • 提供一个可恢复状态的机制,方便用户恢复到历史状态
  • 实现内部状态的封装,仅发起人可访问,其他对象都无法访问
  • 负责人管理备忘录的状态保存,发起人无需关注,符合单一职责原则

主要缺点

  • 资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。

适用场景

  • 当需要创建对象状态快照来恢复其之前的状态时,即需要保存和恢复数据的场景,如游戏中的存档功能
  • 某些需要回滚的场景,因为备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态