設計模式之狀態模式(行為型)
阿新 • • 發佈:2018-12-22
模式定義
一個物件在其內部狀態改變時改變其行為,這個物件我們可以稱為狀態物件,所以狀態模式是一種物件行為型模式。
模式結構
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改變狀態