导言
备忘录模式,英文翻译Memento Design Pattern. 也可以称为快照(Snapshot)模式。
在GoF的《设计模式》中,它是这么定义的:
在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。
这个定义理解起来不难,在23种设计模式中,备忘录模式算是比较好懂的一种设计模式了。在产品设计中我们经常会有重置的功能,也就是回到初始状态或者说回到某种状态,我们就可以用备忘录模式来完成。
玩游戏
在游戏人机模式下,经常会有重置的功能或者保存某种状态的功能,因为人机模式主要是为了快速训练自己在实际对战中的技能,从而可以让玩家自定义状态。有时候在面对大Boss的时候,总是过不去,如果每次都从头开始,那就很烦人了,会让玩家逐渐失去耐心,也需要让玩家保存PK大Boss前的武力状态。
刚备忘录模式的定义是说捕获对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象先前的状态。我们先初始化一个英雄状态:
class Hero {
constructor (life, attack, defence) {
this.life = life || 4000 // 生命值
this.attack = attack || 100 // 攻击力
this.defence = defence || 100 // 防御力
}
}
let hero = new Hero()
console.log(hero)
如果我们需要重置、保存英雄状态的话,传对应的值即可恢复。重置的话直接new一个Hero即可初始化英雄。保存另一状态就传对应的参数值,在游戏进行的过程中,可随时恢复已经保存过的状态。
let hero = new Hero() // 重置
let heroStatus1 = new Hero(5000, 300, 300) // heroStatus1中分别保存了
let heroStatus2 = new Hero(10000, 1000, 1000) // heroStatus2中分别保存了
在需要恢复的时候,可以直接根据已保存的参数进行设置:
let resetStatus1 = new Hero(heroStatus1.life, heroStatus1.attack, heroStatus1.defence)
let resetStatus2 = new Hero(heroStatus2.life, heroStatus2.attack, heroStatus2.defence)
这样resetStatus1和resetStatus2就恢复到了原来设置的状态了。
其实这种模式叫快照模式更贴切和更容易理解,因为快照就相当于记录了之前所有需要的参数状态,而备忘录是提醒将来的自己需要完成某件事,着重在将来而非过去,备忘录模式名称就会让我们的理解跑偏,个人认为不好。