引用百科
(源于Design Pattern):當一個對象的内在狀态改變時允許改變其行為,這個對象看起來像是改變了其類。
狀态模式主要解決的是當控制一個對象狀态的條件表達式過于複雜時的情況。把狀态的判斷邏輯轉移到表示不同狀态的一系列類中,可以把複雜的判斷邏輯簡化。狀态模式的意圖是讓一個對象在其内部狀态改變的時候,其行為也随之改變。狀态模式的示意性類圖如下所示:
相關角色
狀态模式所涉及到的角色有:
●環境(Context)角色,也成上下文:定義用戶端所感興趣的接口,并且保留一個具體狀态類的執行個體。這個具體狀态類的執行個體給出此環境對象的現有狀态。
●抽象狀态(State)角色:定義一個接口,用以封裝環境(Context)對象的一個特定的狀态所對應的行為。
●具體狀态(RealState)角色:每一個具體狀态類都實作了環境(Context)的一個狀态所對應的行為。
具體實作
具體代碼
1、狀态接口
//狀态類接口
public interface State {
// 行為操作
public void handle();
}
2、狀态類具體行為實作
//具體狀态類實作A
public class RealStateA implements State {
// 具體行為實作
@Override
public void handle() {
System.out.println("狀态A...");
System.out.println("執行A操作...");
}
}
//具體狀态類實作B
public class RealStateB implements State {
// 具體行為實作
@Override
public void handle() {
System.out.println("狀态B...");
System.out.println("執行B操作...");
}
}
3、環境角色類
//環境角色類
public class Context {
// 内部狀态
private State status;
public void setStatus(State status) {
this.status = status;
}
// 行為
public void request() {
status.handle();
}
}
4、用戶端Client測試
public class Client {
public static void main(String[] args) {
// 建立環境
Context context = new Context();
// 設定環境狀态
context.setStatus(new RealStateA());
// 狀态改變時行為也自動改變
context.request();
// 狀态改變時行為也自動改變
context.setStatus(new RealStateB());
context.request();
}
}
以上代碼簡單實作了狀态模式,運作輸出:
狀态A...
執行A操作...
狀态B...
執行B操作...
以上代碼狀态模式把所研究的對象的行為包裝在不同的狀态對象裡,每一個狀态對象都屬于一個抽象狀态類的一個子類。狀态模式的意圖是讓一個對象在其内部狀态改變的時候,其行為也随之改變。
适用性
1.一個對象的行為取決于它的狀态,并且它必須在運作時刻根據狀态改變它的行為。
2.一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀态,這個狀态通常用一個或多個枚舉常量表示,通常,有多個操作包含這一相同的條件結構。State模式将每一個條件分支放入一個獨立的類中。這使得你可以根據對象自身的情況将對象的狀态作為一個對象,這一對象可以不依賴于其他對象而獨立變化。