1. 程式人生 > >設計模式(二十) 狀態模式

設計模式(二十) 狀態模式

狀態模式

狀態模式的場景,就是一部電梯的執行,開,關,執行,停止。如果不用狀態模式,會出現很多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 避免了程式的複雜性,提高系統的可維護性
  • 遵循設計原則。 符合開閉原則和單一職責原則。 每個狀態是一個子類,增加狀態就增加子類,修改狀態就修改子類。
  • 封裝性較好。狀態變換放到類的內部來實現。外部呼叫不知道內部如何實現狀態和行為的變換。

狀態模式的缺點

  • 子類會太多,造成類膨脹。 這時候可以在資料庫中建立一個狀態表,然後根據狀態執行相應的操作。

狀態模式的使用場景

  • 行為隨狀態改變而改變。
  • 分支條件過多