2013-01-21 115 views
11

據我所知,State pattern可以用來模擬對象的行爲取決於狀態和Context可以具有的各種狀態封裝在代表State接口的具體類中。我不清楚的是國家轉型如何在這種模式中發生。個人states知道並決定誰跟隨他們,或者是Context決定下一個將會獲得哪個州?誰在狀態模式中定義狀態轉換?

回答

9

從GOF設計模式一書(這是那裏的執行部分):

1.誰來定義的狀態轉換?狀態模式沒有指定哪個參與者定義了狀態轉換的標準。如果標準是固定的,那麼它們可以完全在上下文中實施。但是,通常情況下更爲靈活和適當的是讓國家自己指定繼承國以及何時進行轉型。這需要在Context中添加一個接口,讓State對象明確地設置Context的當前狀態。

以這種方式分散轉換邏輯可以很容易地通過定義新的狀態子類來修改或擴展邏輯。分散化的一個缺點是一個州的子類將至少有另一個子類的知識,這會引入子類之間的實現依賴關係。

4

可能是一個比較具體的例子可以澄清。我希望我正確理解它

假設洗衣機有兩種狀態(開,關)。繼GoF的詞彙:

  • 語境=>洗衣機
  • 國家=> WashingMachineState
  • 具體狀態=> StateOn,StateOff

對於狀態轉換,通過狀態的子類(在我們的例子StateOn和StateOff)我們需要一種方法來改變狀態上下文:

class WashingMachine { 
    WashingMachineState state; 
    ... 
    protected void setState(WashingMachineState newState) { 
     state = newState; 
    } 

    someMethod() { 
     ... 
     state.pushStartButton(this); 
     ... 
    } 
} 
abstract class WashingMachineState { 
    protected void run(); 
    protected void pushStartButton(WashingMachine wm); 
} 
class StateOn extends WashingMachineState { 
    ... 
    void pushStartButton(WashingMachine wm) { 
     wm.setState(new StateOff()) 
    } 
} 

class StateOff extends WashingMachineState { 
    ... 
    void pushStartButton(WashingMachine wm) { 
     wm.setState(new StateOn()) 
    } 
} 

只要保持記住有幾種方式來實現它,創意幫助!