狀態模式(State)

一、概念

狀態模式容許一個對象在其內部狀態改變時改變它的行爲,對象看起來彷佛修改了它所屬的類,屬於行爲型模式。 bash

未命名文件(5).png

二、模式結構

  • 環境角色(Context):定義客戶端所感興趣的接口,而且保留一個具體狀態類的實例。這個具體狀態類的實例給出此環境對象的現有狀態。
  • 抽象狀態角色(State):定義一個接口,用以封裝環境(Context)對象的一個特定的狀態所對應的行爲。
  • 具體狀態角色(ConcreteState):每個具體狀態類都實現了環境(Context)的一個狀態所對應的行爲。

三、使用場景

  • 對象的行爲依賴於它的某些屬性值,狀態的改變將致使行爲的變化
  • 在代碼中包含大量與對象狀態有關的條件語句,這些條件語句的出現,會致使代碼的可維護性和靈活性變差,不能方便地增長和刪除狀態,而且致使客戶類與類庫之間的耦合加強

四、優缺點

優勢:ide

  • 封裝了轉換規則
  • 枚舉可能的狀態,在枚舉狀態以前須要肯定狀態種類
  • 將全部與某個狀態有關的行爲放到一個類中,而且能夠方便地增長新的狀態,只須要改變對象狀態便可改變對象的行爲
  • 容許狀態轉換邏輯與狀態對象合成一體,而不是某一個巨大的條件語句塊
  • 可讓多個環境對象共享一個狀態對象,從而減小系統中對象的個數

缺點:spa

  • 增長系統類和對象的個數
  • 結構與實現都較爲複雜,若是使用不當將致使程序結構和代碼的混亂
  • 對"開閉原則"的支持並不太好,對於能夠切換狀態的狀態模式,增長新的狀態類須要修改那些負責狀態轉換的源代碼,不然沒法切換到新增狀態,並且修改某個狀態類的行爲也需修改對應類的源代碼

五、實例

定義抽象狀態角色ConnectStatecode

public interface ConnectState {
    void handleAction();
}
複製代碼

定義具體狀態角色ReconnectStatecdn

public class ReconnectState implements ConnectState {

    @Override
    public void handleAction() {
        // 重連邏輯
    }
}
複製代碼

定義具體狀態角色SuccessState對象

public class SuccessState implements ConnectState {

    @Override
    public void handleAction() {
        // 成功邏輯
    }
}
複製代碼

定義具體狀態角色FailureStateblog

public class FailureState implements ConnectState {

    @Override
    public void handleAction() {
        // 失敗邏輯
    }
}
複製代碼

定義環境角色Context接口

public class Context {
    private ReconnectState reconnectState;
    private FailureState failureState;
    private SuccessState successState;

    public void reconnect() {
        if (reconnectState == null) {
            reconnectState = new ReconnectState();
        }
        reconnectState.handleAction();
    }

    public void failure() {
        if (failureState == null) {
            failureState = new FailureState();
        }
        failureState.handleAction();
    }

    public void success() {
        if (successState == null) {
            successState = new SuccessState();
        }
        successState.handleAction();
    }
}
複製代碼
相關文章
相關標籤/搜索