設計模式——狀態模式

定義

對有狀態的對象,把複雜的“判斷邏輯”提取到不同的狀態對象中,允許狀態對象在其內部狀態發生改變時改變其行爲。

模板

狀態模式包含以下主要角色。
環境(Context)角色:也稱爲上下文,它定義了客戶感興趣的接口,維護一個當前狀態,並將與狀態相關的操作委託給當前狀態對象來處理。
抽象狀態(State)角色:定義一個接口,用以封裝環境對象中的特定狀態所對應的行爲。
具體狀態(Concrete State)角色:實現抽象狀態所對應的行爲。

實例

下面舉一個上傳過程中狀態控制:

狀態模式中,UploadController 相當於模塊上下文,它持有一個狀態變量mAbstractState,並通過該變量的方法實現狀態的切換。

如何實現狀態轉換?
在IState中,以及所有具體實現State中接口都需要傳入UploadController作爲參數,通過獲取Controller的實例來進行狀態轉換。

優點

1、封裝了轉換規則。
2、枚舉可能的狀態,在枚舉狀態之前需要確定狀態種類。
3、將所有與某個狀態有關的行爲放到一個類中,並且可以方便地增加新的狀態,只需要改變對象狀態即可改變對象的行爲。
4、允許狀態轉換邏輯與狀態對象合成一體,而不是某一個巨大的條件語句塊。
5、可以讓多個環境對象共享一個狀態對象,從而減少系統中對象的個數。

缺點

1、狀態模式的使用必然會增加系統類和對象的個數。
2、狀態模式的結構與實現都較爲複雜,如果使用不當將導致程序結構和代碼的混亂。
3、狀態模式對“開閉原則”的支持並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源代碼,否則無法切換到新增狀態;而且修改某個狀態類的行爲也需修改對應類的源代碼。

適用場景

1、對象的行爲依賴於它的狀態(屬性)並且可以根據它的狀態改變而改變它的相關行爲。
2、代碼中包含大量與對象狀態有關的條件語句

其它實例:
從電商系統訂單狀態說狀態模式!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章