1. 程式人生 > >設計模式之狀態模式(行為型)

設計模式之狀態模式(行為型)

模式定義

一個物件在其內部狀態改變時改變其行為,這個物件我們可以稱為狀態物件,所以狀態模式是一種物件行為型模式。

模式結構

  • Context:環境類
    Context類也可以稱之為上下文類,實際上就是擁有狀態的物件,可以理解為狀態管理器。

  • State:抽象狀態類
    抽象狀態類可以是一個介面類或者抽象類,反正實現的話都是通過具體狀態類。抽象狀態類,封裝環境類不同狀態下的所有動作方法。

  • ConcreteState:具體狀態類
    具體實現類就比較容易理解了,就是繼承抽象狀態類,實現具體的方法,不一定所有的抽象方法都有重寫,根據環境類狀態的改變進行重寫就好,其實也是根據狀態改變改變動作方法。

模式適用場景

  • 狀態模式適用於行為隨狀態改變的業務場景,比如狀態改變了,行為也會做成改變。
  • 業務程式碼中很多條件的情況,加入一些程式碼有很多的if...else,並且經常改變,這種情況就可以使用狀態模式進行編寫。

業務應用場景:

  • 比如OA的審批就可以應用狀態模式,發起申請之後,審批狀態可能有受理,批准等等狀態,每個狀態具有不一樣的動作;

  • 遊戲的角色扮演,每次遊戲版本升級都是會出現狀態動作的改變,用狀態模式進行設計,可以提高程式可拓展性;

簡單例項

上下文類:

public class Context {
   private State state;
 
   public Context(){
      state = null;
   }
 
   public void setState(State state){
      this.state = state;     
   }
 
   public State getState(){
      return state;
   }
}

抽象狀態類:

public abstract class State {
   public void doAction(Context context);
}

具體狀態類:

public class ConcreteState implements State {
 
   public void doAction(Context context) {
      System.out.println("Player is in start state");
      context.setState(this); 
   }
 
   public String toString(){
      return "Start State";
   }
}

呼叫程式碼:

public class StatePatternDemo {
   public static void main(String[] args) {
      Context context = new Context();
 
      ConcreteState concreteState = new ConcreteState();
      concreteState.doAction(context);
 
      System.out.println(context.getState().toString());
 
   }
}

狀態模式分類

狀態模式分為簡單狀態模式和可切換狀態模式。

  • 簡單狀態模式
    簡單狀態模式就是指狀態相對獨立,具體狀態類可以根據抽象狀態類進行程式設計,也就是不需要用環境類中的setState方法改變狀態

  • 可切換狀態的狀態模式
    可切換狀態模式是狀態可以變換的,狀態變換了,具體狀態類在呼叫時就要使用環境類的setState改變狀態