狀態模式的定義與特點
狀態(State)模式的定義:對有狀態的對象,把複雜的“判斷邏輯”提取到不同的狀態對象中,允許狀態對象在其內部狀態發生改變時改變其行爲。
狀態模式是一種對象行爲型模式,其主要優點如下。
- 狀態模式將與特定狀態相關的行爲局部化到一個狀態中,並且將不同狀態的行爲分割開來,滿足“單一職責原則”。
- 減少對象間的相互依賴。將不同的狀態引入獨立的對象中會使得狀態轉換變得更加明確,且減少對象間的相互依賴。
- 有利於程序的擴展。通過定義新的子類很容易地增加新的狀態和轉換。
狀態模式的主要缺點如下。
- 狀態模式的使用必然會增加系統的類與對象的個數。
- 狀態模式的結構與實現都較爲複雜,如果使用不當會導致程序結構和代碼的混亂。
狀態模式的結構與實現
狀態模式把受環境改變的對象行爲包裝在不同的狀態對象裏,其意圖是讓一個對象在其內部狀態改變的時候,其行爲也隨之改變。現在我們來分析其基本結構和實現方法。
1. 模式的結構
狀態模式包含以下主要角色。
- 環境(Context)角色:也稱爲上下文,它定義了客戶感興趣的接口,維護一個當前狀態,並將與狀態相關的操作委託給當前狀態對象來處理。
- 抽象狀態(State)角色:定義一個接口,用以封裝環境對象中的特定狀態所對應的行爲。
- 具體狀態(Concrete State)角色:實現抽象狀態所對應的行爲。
其結構圖
2. 模式的實現
代碼
package test.state;
public class StatePatternClient
{
public static void main(String[] args)
{
Context context=new Context(); //創建環境
context.Handle(); //處理請求
context.Handle();
context.Handle();
context.Handle();
}
}
//環境類
class Context
{
private State state;
//定義環境類的初始狀態
public Context()
{
this.state=new ConcreteStateA();
}
//設置新狀態
public void setState(State state)
{
this.state=state;
}
//讀取狀態
public State getState()
{
return(state);
}
//對請求做處理
public void Handle()
{
state.Handle(this);
}
}
//抽象狀態類
abstract class State
{
public abstract void Handle(Context context);
}
//具體狀態A類
class ConcreteStateA extends State
{
public void Handle(Context context)
{
System.out.println("當前狀態是 A.");
context.setState(new ConcreteStateB());
}
}
//具體狀態B類
class ConcreteStateB extends State
{
public void Handle(Context context)
{
System.out.println("當前狀態是 B.");
context.setState(new ConcreteStateA());
}
}
結果
狀態模式的應用場景
通常在以下情況下可以考慮使用狀態模式。
- 當一個對象的行爲取決於它的狀態,並且它必須在運行時根據狀態改變它的行爲時,就可以考慮使用狀態模式。
- 一個操作中含有龐大的分支結構,並且這些分支決定於對象的狀態時。