以下內容摘抄於《C#大話設計模式》
狀態模式(State),當一個對象的內在狀態改變時允許改變其行爲,這個對象看起來像是改變了其類。
狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。
狀態模式的結構圖:
State類,抽象狀態類,定義一個接口以封裝與Context的一個特定狀態相關的行爲。
package com.schema.state;
public abstract class State {
public abstract void Handle(Context context);
}
Concrete類:具體狀態類,每一個子類實現一個與Context的一個狀態相關的行爲。
package com.schema.state;
public class ConcreteStateA extends State {
public void Handle(Context context){
// 設置ConcreteStateA的下一個狀態是ConcreteStateB
context.setState(new ConcreteStateB());
}
}
package com.schema.state;
public class ConcreteStateB extends State {
public void Handle(Context context){
// 設置ConcreteB的下一個狀態時ConcreteStateA
context.setState(new ConcreteStateA());
}
}
Context類和客戶端代碼
package com.schema.state;
public class Context {
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
System.out.println("現在的狀態是:" + state.getClass().getName());
}
public Context(State state){
this.state = state;
}
public void Request(){
state.Handle(this);
}
public static void main(String[] args){
Context context = new Context(new ConcreteStateA());
context.Request();
context.Request();
context.Request();
context.Request();
}
}
運行結果如下: