文章目錄
- 描述
-
- 定義
- 類型
- 動機
- UML類圖
- 時序圖
- 實作
-
- 主要角色
- 示例
- 适用場景
- 優點
- 缺點
- 相關模式
描述
定義
允許一個對象在其内部狀态改變時改變它的行為,對象看起來似乎修改了它的類。
類型
對象行為型模式
動機
對象的行為依賴于它的狀态(屬性),并且可以根據它的狀态改變而改變它的相關行為。
UML類圖
時序圖
實作
主要角色
- Context:上下文
- 定義客戶感興趣的接口。
- 維護一個ConcreteState子類的執行個體,這個執行個體定義目前狀态。
- State:狀态接口類
- 定義一個接口以封裝與Context的一個特定狀态相關的行為。
- ConcreteState:具體狀态類
- 每一子類實作一個與Context的一個狀态相關的行為。
示例
- Context:上下文。誰定義狀态轉換:如果規則是固定的,那麼可在Context中完全實作。然而若讓State子類自身指定後繼狀态以及何時進行轉換,通常更靈活更合适,但缺點是在各子類之間産生了實作依賴。
public class Context { private State state; public Context(State state) { this.state = state; } public State getState() { return state; } public void changeState() { this.state = this.state.next(); } public void request() { state.handle(this); } }
- State:狀态接口類。建立和銷毀State對象通常有兩種做法:1) 僅當需要State對象時才建立它們并随後銷毀它們;2) 提前建立它們并且始終不銷毀它們。
interface State { void handle(Context context); State next(); }
- ConcreteState:具體狀态類
public class ConcreteState1 implements State { @override public void next() { return new ConcreteState2(); } @override public void handle(Context context) { System.out.println("ConcreteState1"); } } public class ConcreteState2 implements State { @override public void next() { return new ConcreteState1(); } @override public void handle(Context context) { System.out.println("ConcreteState2"); } }
- Client:客戶類
public class Client { public static void main(String[] args) { Context context = new Context(new ConcreteState1()); context.request(); context.changeState(); context.request(); } }
适用場景
- 對象的行為随它的狀态改變而改變,并且它必須在運作時刻動态決定。
- 條件、分支語句的代替者。一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀态。
優點
- 将與特定狀态相關的行為局部化,并且将不同狀态的行為分割開來。
- 封裝了轉換規則。通過定義新的子類可以很容易的增加新的狀态和轉換。
- 使得狀态轉換顯式化。為不同的狀态引入獨立的對象使得轉換變得更加明确。而且可保證狀态轉換是原子的。
- 狀态對象可被共享。如果State對象沒有執行個體變量——即它們表示的狀态完全以它們的類型來編碼——那麼各Context對象可以共享一個State對象。
缺點
- 會增加系統類和對象的個數。
- 對"開閉原則"的支援不太好。增加新的狀态類需要修改那些負責狀态轉換的源代碼,而且修改某個狀态類的行為也需修改對應類的源代碼。
相關模式
- Flyweight:通過享元模式來實作何時以及怎樣共享狀态對象。
- Singleton:狀态對象通常是單例。