10 模式擴充
-
共享狀态
在有些情況下多個環境對象需共享同一狀态,若期望在系統中實作多個環境對象執行個體共享一個或多個狀态對象,那麼需要将這些狀态對象定義為環境的靜态成員對象。
簡單狀态模式
狀态都互相獨立,狀态之間無須進行轉換的狀态模式,這是最簡單的一種狀态模式。
每個狀态類都封裝與狀态相關的操作,無需關心狀态切換,可在用戶端直接執行個體化狀态類,然後将狀态對象設定到環境類。
遵循“開閉原則”,在用戶端可以針對抽象狀态類進行程式設計,而将具體狀态類寫到配置檔案中,同時增加新的狀态類對原有系統也不造成任何影響。
可切換狀态的狀态模式
大多數的狀态模式都是可切換狀态的狀态模式,在實作狀态切換時,在具體狀态類内部需要調用環境類Context的setState()方法進行狀态的轉換操作,在具體狀态類中可以調用到環境類的方法,是以狀态類與環境類之間通常還存在關聯關系或者依賴關系。通過在狀态類中引用環境類的對象來回調環境類的setState()方法實作狀态的切換。在這種可以切換狀态的狀态模式中,增加新的狀态類可能需要修改其他某些狀态類甚至環境類的源代碼,否則系統無法切換到新增狀态。
11 總結
狀态模式允許一個對象在其内部狀态改變時改變它的行為,對象看起來似乎修改了它的類。其别名為狀态對象,狀态模式是一種對象行為型模式。
狀态模式包含三個角色:環境類又稱為上下文類,它是擁有狀态的對象,在環境類中維護一個抽象狀态類State的執行個體,這個執行個體定義目前狀态,在具體實作時,它是一個State子類的對象,可以定義初始狀态;抽象狀态類用于定義一個接口以封裝與環境類的一個特定狀态相關的行為;具體狀态類是抽象狀态類的子類,每一個子類實作一個與環境類的一個狀态相關的行為,每一個具體狀态類對應環境的一個具體狀态,不同的具體狀态類其行為有所不同。
狀态模式描述了對象狀态的變化以及對象如何在每一種狀态下表現出不同的行為。
狀态模式的主要優點在于封裝了轉換規則,并枚舉可能狀态,它将所有與某個狀态有關的行為放到一個類中,并且可以友善地增加新的狀态,隻需要改變對象狀态即可改變對象的行為,還可以讓多個環境對象共享一個狀态對象,進而減少系統中對象的個數;其缺點在于使用狀态模式會增加系統類和對象的個數,且狀态模式的結構與實作都較為複雜,如果使用不當将導緻程式結構和代碼的混亂,對于可以切換狀态的狀态模式不滿足“開閉原則”的要求。
适用情況
- 對象的行為依賴于它的狀态(屬性)并且可以根據它的狀态改變而改變它的相關行為
- 代碼中包含大量與對象狀态有關的條件語句,這些條件語句的出現,會導緻代碼的可維護性和靈活性變差,不能友善地增加和删除狀态,使客戶類與類庫之間的耦合增強。