备忘录模式
备忘录模式(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)