設計模式之狀態模式【State Pattern】

狀態模式把對象的行爲包裝在不同的狀態對象裏,每一個狀態對象都有一個共同的抽象狀態類。

1、定義

當一個對象的內在狀態改變時允許改變其行爲,這個對象看起來是改變了其類。

2、使用場景

  1. 一個對象的行爲取決於它的狀態,並且它必須在運行時根據狀態改變它的行爲。
  2. 代碼中包含大量與對象狀態有關的條件語句。

3、UML圖

這裏寫圖片描述
狀態模式和策略模式的結構基本是一樣的。但它們的目的、本質卻完全不一樣。
狀態模式的行爲是平行的、不可替換的。
策略模式的行爲是彼此獨立的、可相互替換的。

4、示例代碼

public interface State {
    /**
     * 狀態對應的處理
     */
    public void handle(String sampleParameter);
}

public class ConcreteStateA implements State {

    @Override
    public void handle(String sampleParameter) {
        System.out.println("ConcreteStateA handle :" + sampleParameter);
    }
}

public class ConcreteStateB implements State {

    @Override
    public void handle(String sampleParameter) {
        System.out.println("ConcreteStateB handle :" + sampleParameter);
    }
}

public class Context {
    // 持有一個State類型的對象實例
    private State state;

    public void setState(State state) {
        this.state = state;
    }

    /**
     * 用戶感興趣的接口方法
     */
    public void request(String param) {
        // 轉調state來處理
        state.handle(param);
    }
}

客戶端調用:

public class Client {

    public static void main(String[] args) {
        // 創建狀態
        State state = new ConcreteStateA();
        Context context = new Context();
        context.setState(state);
        // 請求
        context.request("test");
    }
}

上下文和狀態處理對象

  • 在狀態模式中,上下文是持有狀態的對象,但上下文並不處理跟狀態相關的行爲,而是把處理狀態的功能委託給了狀態對應的狀態處理類來處理。
  • 在具體的狀態處理類中,經常需要獲取上下文自身的數據,甚至在必要的時候回回調上下文的方法,所以,通常將上下文自身當做參數傳遞給具體的狀態處理類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章