設計模式(二十) 狀態模式
阿新 • • 發佈:2018-11-09
狀態模式
狀態模式的場景,就是一部電梯的執行,開,關,執行,停止。如果不用狀態模式,會出現很多switch case或者if else 進行電梯狀態的判斷。
狀態模式,就是一個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其他類。
狀態模式的3個角色:
- State 抽象狀態角色。 負責物件狀態定義,封裝環境角色以實現狀態切換。
- ConcreteState 具體狀態角色。 每一個具體狀態角色必須完成2個職責:1. 本狀態的行為管理。2.趨向狀態管理,通俗的說是本狀態要做的事,以及本狀態如何過渡到其他狀態的。
- Context 環境角色。 定義客戶端需要的介面,並且負責具體狀態的切換。
public abstract class State{ protected Context context; public void setContext(Context context){ this.context=context; } //行為1 public abstract void handle1(); //行為2 public abstract void handle2(); } public class ConcreteState1 extends State{ @Override public void handle1() { //本狀態處理邏輯 } @Override public void handle2() { //設定當前狀態2 super.context.setCurrentState(Context.STATE2); //過渡到STATE2 ,由Context實現 super.context.handle2(); } } public class ConcreteState2 extends State{ @Override public void handle1() { //設定當前狀態1 super.context.setCurrentState(Context.STATE1); //過渡到STATE1 ,由Context實現 super.context.handle1(); } @Override public void handle2() { //本狀態處理邏輯 } } public class Context{ public final static State STATE1=new ConcreteState1(); public final static State STATE2=new ConcreteState2(); private State currentState; public Context(){ } public State getCurrentState(){ return this.currentState; } public void setCurrentState(State currentState){ this.currentState =currentState; this.currentState.setContext(this); } public void handle1(){ this.currentState.handle1(); } public void handle2(){ this.currentState.handle2(); } } public class Client{ public static void mian(String[] args){ Context context=new Context(); context.setCurrentState(new ConcreteState1()); context.handle1(); context.handle2(); } }
狀態模式的優點
- 結構清晰。避免了過多的switch/case 或if/else 避免了程式的複雜性,提高系統的可維護性
- 遵循設計原則。 符合開閉原則和單一職責原則。 每個狀態是一個子類,增加狀態就增加子類,修改狀態就修改子類。
- 封裝性較好。狀態變換放到類的內部來實現。外部呼叫不知道內部如何實現狀態和行為的變換。
狀態模式的缺點
- 子類會太多,造成類膨脹。 這時候可以在資料庫中建立一個狀態表,然後根據狀態執行相應的操作。
狀態模式的使用場景
- 行為隨狀態改變而改變。
- 分支條件過多