狀態模式定義
在狀態模式(State Pattern)中,類的行爲是基於它的狀態改變的。這種類型的設計模式屬於行爲型模式。
在狀態模式中,我們創建表示各種狀態的對象和一個行爲隨着狀態對象改變而改變的 context 對象。
使用場景
意圖:允許對象在內部狀態發生改變時改變它的行爲,對象看起來好像修改了它的類。
主要解決:對象的行爲依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行爲。
何時使用:代碼中包含大量與對象狀態有關的條件語句。
如何解決:將各種具體的狀態類抽象出來。
關鍵代碼:通常命令模式的接口中只有一個方法。而狀態模式的接口中有一個或者多個方法。而且,狀態模式的實現類的方法,一般返回值,或者是改變實例變量的值。也就是說,狀態模式一般和對象的狀態有關。實現類的方法有不同的功能,覆蓋接口中的方法。狀態模式和命令模式一樣,也可以用於消除 if…else 等條件選擇語句。
實例
射擊遊戲中游戲角色的動作有”run,smill,shoot“每一種動作都要執行對應方法跑,笑,射擊,而且還有角色跑着射擊,笑着射擊,跑着笑着。。。。
任意組合
如果不加任何思考單純用if else實現
極其難看而且不易維護
如果用狀態模式進行優化
function Game(){
this.state = [];
this.action = {
run:function(){
console.log("跑")
},
smill: function () {
console.log("笑")
},
shoot: function () {
console.log("射擊")
}
}
}
Game.prototype.putAction = function(action){
if(typeof action === "string"){
this.state.push(action);
}else{
this.state = this.state.concat(action);
}
}
Game.prototype.start = function(){
this.state.forEach(element => {
this.action[element]();
});
}
let game = new Game();
game.putAction('run');
game.start();
game.putAction(['run', 'shoot']);
game.start();
game.putAction(['run','smill','shoot']);
game.start();