定義
當一個對象的內在狀態改變時,其行為也隨之改變,從外部觀察這個對象像是改變了類。
使用場景
(1)一個對象的行為取決于它的狀態,并且它必須在運行時根據狀態改變其行為。
(2)代碼中包含大量與對象狀態有關的條件語句。
UML類圖
關鍵點
(1)狀態模式和策略模式的結構幾乎完全一樣,但他們的目的、本質完全不一樣。狀態模式的行為是平行的、不可替換的;策略模式的行為是彼此獨立、可相互替換的。
(2)狀態模式將每一個條件分支放入一個獨立的類中,使得使用者可以根據對象自身的情況將對象的狀態作為一個可獨立變化的對象。
(3)在不同的狀態中對同一個請求做了不同的處理。
(4)狀態模式的實質是將一個if-else或者switch-case用多態來實現。
實現方式
狀態接口
public interface State{
? ? int operation1();
? ? int operation2();
}
狀態A類
public class StateA implements State{
? ? @Override
? ? public int operation1(){
? ? ? ? return 1;
? ? }
? ? @Override
? ? public int operation2(){
? ? ? ? return 0;
? ? }
}
狀態B類
public class StateB implements State{
? ? @Override
? ? public int operation1(){
? ? ? ? return 0;
? ? }
? ? @Override
? ? public int operation2(){
? ? ? ? return 1;
? ? }
}
Context類
public class Context{
? ? State mState;
? ? public void setState(State s){
? ? ? ? this.mState= s;
? ? }
? ? public int operation1(){
? ? ? ? return mState.operation1();
? ? }
? ? public int operation2(){
? ? ? ? return mState.operation2();
? ? }
}
調用例子:
public void class Test{
? ? public static void main(String [] args){
? ? ? ? StateA a = new StateA();
? ? ? ? Context context = new Context();
? ? ? ? context.setState(a);
? ? ? ? context.operation1();
? ? }
}
策略模式的優缺點
優點
將所有與一個特定狀態相關的行為都放入一個狀態對象中,將繁瑣的狀態判斷轉換成結構清晰的狀態類族,避免代碼膨脹,同時保證可擴展性和可維護性。
缺點
增加系統類和對象的個數
Android中的狀態模式舉例
Wifi的狀態類State的子類,如初始狀態子類InitialState,驅動加載狀態子類DriverStartingState等
——2017.08.09