《JavaScript設(shè)計模式與開發(fā)實踐》之狀態(tài)模式

定義:把食物的每種狀態(tài)都封裝成單獨的類,跟此種狀態(tài)有關(guān)的行為都封裝在這個類的內(nèi)部。

允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,看起似乎修改了它的類。

優(yōu)點:

  1. 定義了狀態(tài)與行為之間的關(guān)系,并將它們封裝在一個類里,通過增加新的狀態(tài)類,很容易增加新的狀態(tài)和轉(zhuǎn)換;
  2. 避免 context 無限膨脹,狀態(tài)切換的邏輯被分布在狀態(tài)類中,也去掉了 context 中原本過多的條件分支;
  3. 用對象代替字符串來記錄當(dāng)前狀態(tài),使得狀態(tài)的切換更加一目了然;
  4. context 中的請求動作和狀態(tài)類中封裝的行為可以非常容易地獨立變化而互不影響。

缺點:
會在系統(tǒng)中定義許多狀態(tài)類,系統(tǒng)會因此而增加不少對象。雖然避開了不受歡迎的條件分支語句,但也造成了邏輯分散的問題。我們無法在一個地方就看出整個狀態(tài)機的邏輯。

舉栗子啦(有一個電燈,電燈上面只有一個開關(guān)。當(dāng)電燈關(guān)著的時候,此時按下開關(guān),電燈會切換到弱光狀態(tài);再按一次開關(guān),電燈會切換到強光狀態(tài),再按一次是關(guān)閉狀態(tài);同一個開關(guān)按鈕,在不同的狀態(tài)下,表現(xiàn)出來的行為是不一樣的。):

// OffLightState:
var OffLightState = function( light ){
 this.light = light;
};
OffLightState.prototype.buttonWasPressed = function(){
 console.log( '弱光' ); // offLightState 對應(yīng)的行為
 this.light.setState( this.light.weakLightState ); // 切換狀態(tài)到 weakLightState
};
// WeakLightState:
var WeakLightState = function( light ){
 this.light = light;
};
WeakLightState.prototype.buttonWasPressed = function(){
 console.log( '強光' ); // weakLightState 對應(yīng)的行為
 this.light.setState( this.light.strongLightState ); // 切換狀態(tài)到 strongLightState
};
// StrongLightState:
var StrongLightState = function( light ){
 this.light = light;
};
StrongLightState.prototype.buttonWasPressed = function(){
 console.log( '關(guān)燈' ); // strongLightState 對應(yīng)的行為
 this.light.setState( this.light.offLightState ); // 切換狀態(tài)到 offLightState
}; 
var Light = function(){
 this.offLightState = new OffLightState( this );
 this.weakLightState = new WeakLightState( this );
 this.strongLightState = new StrongLightState( this );
 this.button = null;
}; 

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天的兩位專家:齊學(xué)紅教授,一襲紅衣,溫婉雅致。周益民老師,清瘦依然,儒雅依舊。聆聽他們的講述,一個共同的感...
    樂萌LY閱讀 333評論 0 1
  • 所謂“正語”,就是不再隨著自己的習(xí)氣和性情,去和別人做言語上的交流。 盡量在說話之前,對自己所要說的話,有所審視和...
    kevali閱讀 2,172評論 0 1
  • 07062017 星期三 晴 一大早就跟女兒干上了,女兒的壞習(xí)慣叨叨過多次,今天碰巧又讓我看見,沒控制住又發(fā)火...
    圓圓jXY閱讀 277評論 0 0

友情鏈接更多精彩內(nèi)容