1. 程式人生 > >狀態模式-State Pattern

狀態模式-State Pattern

1. 主要優點

       狀態模式的主要優點如下:

       (1) 封裝了狀態的轉換規則,在狀態模式中可以將狀態的轉換程式碼封裝在環境類或者具體狀態類中,可以對狀態轉換程式碼進行集中管理,而不是分散在一個個業務方法中。

       (2) 將所有與某個狀態有關的行為放到一個類中,只需要注入一個不同的狀態物件即可使環境物件擁有不同的行為。

       (3) 允許狀態轉換邏輯與狀態物件合成一體,而不是提供一個巨大的條件語句塊,狀態模式可以讓我們避免使用龐大的條件語句來將業務方法和狀態轉換程式碼交織在一起。

 

       2. 主要缺點

       狀態模式的主要缺點如下:

       (1) 狀態模式的使用必然會增加系統中類和物件的個數,導致系統執行開銷增大。

       (3) 狀態模式對“開閉原則”的支援並不太好,增加新的狀態類需要修改那些負責狀態轉換的原始碼,否則無法轉換到新增狀態;而且修改某個狀態類的行為也需修改對應類的原始碼。

 

      3. 適用場景

      在以下情況下可以考慮使用狀態模式:

      (1) 物件的行為依賴於它的狀態(如某些屬性值),狀態的改變將導致行為的變化。

      (2) 在程式碼中包含大量與物件狀態有關的條件語句,這些條件語句的出現,會導致程式碼的可維護性和靈活性變差,不能方便地增加和刪除狀態,並且導致客戶類與類庫之間的耦合增強。

3個物件

   ● Context(環境類):環境類又稱為上下文類,它是擁有多種狀態的物件。由於環境類的狀態存在多樣性且在不同狀態下物件的行為有所不同,因此將狀態獨立出去形成單獨的狀態類。在環境類中維護一個抽象狀態類State的例項,這個例項定義當前狀態,在具體實現時,它是一個State子類的物件。

       ● State(抽象狀態類):它用於定義一個介面以封裝與環境類的一個特定狀態相關的行為,在抽象狀態類中聲明瞭各種不同狀態對應的方法,而在其子類中實現類這些方法,由於不同狀態下物件的行為可能不同,因此在不同子類中方法的實現可能存在不同,相同的方法可以寫在抽象狀態類中。

       ● ConcreteState(具體狀態類):它是抽象狀態類的子類,每一個子類實現一個與環境類的一個狀態相關的行為,每一個具體狀態類對應環境的一個具體狀態,不同的具體狀態類其行為有所不同。

 

注意事項:

1,狀態轉換寫在狀態類(這個時候,狀態類需要持有環境類的引用)還是再環境類中,需要自己考慮

2,狀態需要共享,也就是可以多個環境類一起操作時候,需要把狀態類設定成環境類的靜態變數或者單例模式
---------------------
作者:Liuwei-Sunny
來源:CSDN
原文:https://blog.csdn.net/lovelion/article/details/8523062
版權宣告:本文為博主原創文章,轉載請附上博文連結!