Skip to content

备忘录模式

备忘录模式(Memento Pattern) 是一种 行为型设计模式,它允许在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便之后能将该对象恢复到原先保存的状态。

角色

  • Originator

我们知道备忘录模式就是要完成保存状态,然后恢复状态的功能。那么保存和恢复谁的状态呢?对了,就是这个角色的状态。

  • Memento

这个就比较简单了,就是一个存储状态的类,里面没有业务逻辑。

  • CareTaker

负责保存和恢复Originator的状态,状态是保存在这类里面的。

代码示例:

typescript
//定义保存的数据结构
type IUser = { name: string; age: number }

//定义一个备忘录原始对象的抽象接口
class Originator {
  //以json字符串的形式存储数据快照
  public state: IUser = { name: 'eddie', age: 22 }

  /**
   * 保存一个数据快照
   * @returns
   */
  public makeMemento(): string {
    return JSON.stringify(this.state)
  }

  /**
   * 恢复数据快照
   * @param mememto
   */
  public resetMememto(memento: string) {
    this.state = JSON.parse(memento)
  }
}

//实例化一个发起者对象
const $originatorInstance = new Originator()

//管理者类
class CareTaker {
  private mementos = [] as string[]
  /**
   * 管理者添加数据快照
   * @param mememto
   */
  public push(mememto: string) {
    this.mementos.push(mememto)
  }

  /**
   * 获取备忘录快照
   * @param i
   * @returns
   */
  public getMememto(i: number) {
    if (i > this.mementos.length || i < 0) throw new Error('无效的备忘录索引')
    return this.mementos[i]
  }
}

//实例化一个管理者实例
const $careTakerInstance = new CareTaker()

//备忘录
const memento = $originatorInstance.makeMemento()
//保存备忘录
$careTakerInstance.push(memento)

//修改原始对象的值
$originatorInstance.state.name = 'hubsky'
$originatorInstance.state.age = 10

//再保存备忘录
$careTakerInstance.push($originatorInstance.makeMemento())

//修改原始对象的值
$originatorInstance.state.name = 'hubsky-2'
$originatorInstance.state.age = 15

//第三次次保存备忘录
$careTakerInstance.push($originatorInstance.makeMemento())

//恢复备忘录
$originatorInstance.resetMememto($careTakerInstance.getMememto(1))

console.log('[ 第2个备份的数据 ] >', $originatorInstance.state)