狀態模式

標籤(空格分隔): 設計模式設計模式


行爲型模式。
類的行爲是基於它的狀態改變的,狀態改變,行爲跟着改變。
具體實現:
一個狀態接口,具體狀態類實現該接口。
一個Context類,擁有狀態的實例,隨着這個狀態的改變,它的行爲會改變。設計

注重狀態的轉變,狀態只能從一個狀態轉變按規則轉變成另外一個狀態,而不是任意轉換。例如房間只能從未預訂變成預訂。對象

類圖結構
blog

角色:
環境類(Context): 定義客戶感興趣的接口。維護一個ConcreteState子類的實例,這個實例定義當前狀態。
抽象狀態類(State): 定義一個接口以封裝與Context的一個特定狀態相關的行爲。
具體狀態類(ConcreteState): 每一子類實現一個與Context的一個狀態相關的行爲。接口

把狀態封裝成一個類,狀態的改變只須要傳入不一樣的具體state實現便可。程序

當一個對象的行爲取決於它的狀態,而且它必須在運行時刻根據狀態改變它的行爲時,就能夠考慮使用狀態模式來。im

State模式將全部與一個特定的狀態相關的行爲都放入一個對象(具體state)中。img

應用場景:di

  1. 電燈開關,按一下,狀態變成開燈,再按一下,狀態變成關燈。
  2. 網上投票,投一次,正常。再投,變成反覆投票。再投,取消當次投票資格。再投,系統拉黑,之後不再能投。
  3. 酒店訂房系統,房間有預訂、入住、退訂、退房多種狀態。

優勢:
新增狀態時,一定會增長狀態相應的行爲,使用狀態模式不用爲新狀態增長不少if else判斷,只須要寫一個新類實現State接口,而後將狀態改爲新狀態便可。Context會跟據新狀態的具體實現來改變行爲。loading

狀態模式的主要優勢在於封裝了轉換規則,並枚舉可能的狀態,它將全部與某個狀態有關的行爲放到一個類中,而且能夠方便地增長新的狀態,只須要改變對象狀態便可改變對象的行爲,還可讓多個環境對象共享一個狀態對象,從而減小系統中對象的個數;其缺點在於使用狀態模式會增長系統類和對象的個數,且狀態模式的結構與實現都較爲複雜,若是使用不當將致使程序結構和代碼的混亂,對於能夠切換狀態的狀態模式不知足「開閉原則」的要求。

狀態模式和策略模式一個很重要的區別,狀態模式的行爲是平行性的,不可相互替換的;而策略模式的行爲是平等性的,是能夠相互替換的。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息