python 設計模式之狀態模式

1.爲何會出現狀態模式?

在軟件開發過程當中,各類應用程序可能會根據不一樣的狀況作出不一樣的處理。最直接的方案就是把全部的可能發生的狀況都考慮到。而後使用條件語句(if...elseif...elseif......else)對不一樣狀況的做出判斷並進行處理。可是假如狀態比較複雜,就會出現多個判斷語句,判斷語句中又包含這各類操做,這顯然是不受歡迎的。狀態模式的出現就是爲了解決這種問題。html

 

2.啥是狀態模式?

狀態模式用於解決系統中複雜對象的狀態轉換以及不一樣狀態下行爲的封裝問題,將一個對象的狀態從該對象中分離出來,封裝到專門的狀態類中,使得對象狀態能夠靈活變化。spa

狀態模式:容許一個對象在其內部狀態改變時改變它的行爲,即不一樣的狀態對應了不一樣的行爲。對象看起來彷佛修改了它的類。不少狀況下,一個對象的行爲取決於一個或者多個動態變化的屬性。這樣的屬性叫作狀態,這樣的對象叫作有狀態的對象。其狀態是從事先定義好的一系列值中取出的。當一個這樣的對象與外部事件產生互動時,其內部狀態就會改變,從而使得系統的行爲也隨之改變。設計

歸納以下:3d

1、狀態模式的優勢是結構清晰,相比於if…else…簡約了很多;
二、封裝性好,外部調用沒必要知道內部實現細節。
code

 

 

3.狀態模式的優勢?

狀態模式的好處是將與特定狀態相關的行爲局部化,而且將不一樣狀態的行爲分割開來。[DP]就是將特定的狀態相關的行爲都放入一個對象中,因爲全部與狀態相關的代碼都存在於某個ConcretState中,因此經過定義新的子類能夠很容易的增長新的狀態和轉換[DP]。這樣作的目的就是爲了消除龐大的條件分支語句,大的分支判斷會使得它們難以修改和擴展。狀態模式經過把各類狀態轉移邏輯分不到State的子類之間,來減小相互之間的依賴。htm

 

 4.狀態模式應用場景

何時須要考慮使用狀態模式呢?當一個對象的行爲取決於它的狀態,而且它必須在運行時刻根據狀態改變它的行爲,就可使用狀態模式。另外,若是業務需求某項業務有多個狀態,一般都是一些枚舉常量,狀態的變化都是依靠大量的分支判斷語句來實現,此時應該考慮將每一種業務狀態定義爲一個State子類,這樣這些對象就能夠不依賴於其餘對象而獨立變化了,若是某天客戶需求改了,增長或減小業務狀態或改變狀態流程,都不是困難了。對象

歸納以下:blog

行爲狀態改變的場景。這點在各類控制器中很是常見,同時,邏輯結構爲狀態轉移圖的場景中都很是適用。事件

 好比電梯樓層停/開門/走控制了,好比糖果機器投幣賣糖果了,好比自動開關門了,等等。開發

 

5.狀態模式的缺點?

在狀態比較多時,子類也會很是多,不便於管理。

 

 6.舉個栗子(不用狀態模式和用狀態模式對比)

 

 1)不用狀態模式的時候

 

 

這個類中的flow方法過長,並且有不少判斷分支,意味着它的責任過大了。面向對象設計其實就是但願作到代碼的責任分解。因此這個類違背了單一職責原則

此外,flow方法裏有這麼多判斷,使得任何需求的改動或增長,都須要去更改這個方法。因此這個類也違背了開放-封閉原則

 

 

 2)用狀態模式的時候

 

 

3)增長條件了

假設老闆說今天版本要上線,要球22:00到24:00過來加班,

修改對好比下

 

 

參考

https://www.cnblogs.com/welan/p/9130283.html

https://www.cnblogs.com/CheeseZH/p/9458703.html

https://www.cnblogs.com/liuqingzheng/articles/10039743.html