定義:把食物的每種狀態(tài)都封裝成單獨的類,跟此種狀態(tài)有關(guān)的行為都封裝在這個類的內(nèi)部。
允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,看起似乎修改了它的類。
優(yōu)點:
- 定義了狀態(tài)與行為之間的關(guān)系,并將它們封裝在一個類里,通過增加新的狀態(tài)類,很容易增加新的狀態(tài)和轉(zhuǎn)換;
- 避免 context 無限膨脹,狀態(tài)切換的邏輯被分布在狀態(tài)類中,也去掉了 context 中原本過多的條件分支;
- 用對象代替字符串來記錄當(dāng)前狀態(tài),使得狀態(tài)的切換更加一目了然;
- 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;
};