1、模式标准

模式名称:备忘录模式

模式分类:行为型

模式意图:在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态

结构图:

用23种设计模式打造一个cocos creator的游戏框架----(十九)备忘录模式-LMLPHP

 适用于:

1、必须保存一个对象在某一个时刻的(部分) 状态,这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

2、分析与设计

假设通过保存备份按钮对当前的游戏进行备份,如果后面失败了,通过读取备份,从刚才备份的位置重新开始。

意图:在不破坏封装性的前提下捕获一个对象(GameModel)的内部状态,并在对象(GameModel)之外保存这个状态。这样以后就可以将对象(GameModel)恢复到原先保存的状态

3、开始打造

用23种设计模式打造一个cocos creator的游戏框架----(十九)备忘录模式-LMLPHP

GameModel内的使用

    // 保存到备忘录
    saveStateToMemento() {
        let memento = gameInstance.gameMementoManager.createMemento()
        memento.setState(this.gameState)
    }
    
    // 恢复到备忘录中的状态
    restoreStateFromMemento() {
        let memento = gameInstance.gameMementoManager.getLastMemento()
        this.gameState = memento.getState()
    }

 GameMemento游戏备忘录


// 备忘录类 Memento,它表示游戏的历史状态
export class GameMemento {
    private state: any;

    setState(val: any) {
        this.state = val
    }

    getState(): any {
        return this.state;
    }
}

  备忘录管理

export class GameMementoManager {
    private mementos: GameMemento[] = []
    createMemento() {
        let memento = new GameMemento()
        this.mementos.push(memento)
        return memento
    }
    getLastMemento() {
        return this.mementos[this.mementos.length - 1]
    }
    getMementoByIndex(index: number) {
        return this.mementos[index]
    }
}

 4、开始使用

// 点击保存备忘录   
DemoGameModelSystem.saveStateToMemento() // 保存状态
  
// 点击恢复到原始状态 
restoreMemento() {
   console.log('restoreMemento')
   DemoGameModelSystem.restoreStateFromMemento()
}
12-19 20:10