標籤(空格分隔): 設計模式設計模式
行爲型模式。
類的行爲是基於它的狀態改變的,狀態改變,行爲跟着改變。
具體實現:
一個狀態接口,具體狀態類實現該接口。
一個Context類,擁有狀態的實例,隨着這個狀態的改變,它的行爲會改變。設計
注重狀態的轉變,狀態只能從一個狀態轉變按規則轉變成另外一個狀態,而不是任意轉換。例如房間只能從未預訂變成預訂。對象
類圖結構
blog
角色:
環境類(Context): 定義客戶感興趣的接口。維護一個ConcreteState子類的實例,這個實例定義當前狀態。
抽象狀態類(State): 定義一個接口以封裝與Context的一個特定狀態相關的行爲。
具體狀態類(ConcreteState): 每一子類實現一個與Context的一個狀態相關的行爲。接口
把狀態封裝成一個類,狀態的改變只須要傳入不一樣的具體state實現便可。程序
當一個對象的行爲取決於它的狀態,而且它必須在運行時刻根據狀態改變它的行爲時,就能夠考慮使用狀態模式來。im
State模式將全部與一個特定的狀態相關的行爲都放入一個對象(具體state)中。img
應用場景:di
優勢:
新增狀態時,一定會增長狀態相應的行爲,使用狀態模式不用爲新狀態增長不少if else判斷,只須要寫一個新類實現State接口,而後將狀態改爲新狀態便可。Context會跟據新狀態的具體實現來改變行爲。loading
狀態模式的主要優勢在於封裝了轉換規則,並枚舉可能的狀態,它將全部與某個狀態有關的行爲放到一個類中,而且能夠方便地增長新的狀態,只須要改變對象狀態便可改變對象的行爲,還可讓多個環境對象共享一個狀態對象,從而減小系統中對象的個數;其缺點在於使用狀態模式會增長系統類和對象的個數,且狀態模式的結構與實現都較爲複雜,若是使用不當將致使程序結構和代碼的混亂,對於能夠切換狀態的狀態模式不知足「開閉原則」的要求。
狀態模式和策略模式一個很重要的區別,狀態模式的行爲是平行性的,不可相互替換的;而策略模式的行爲是平等性的,是能夠相互替換的。