1.為什么會出現(xiàn)狀態(tài)模式挨厚?
在軟件開發(fā)過程中,各種應用程序可能會根據(jù)不同的情況做出不同的處理。最直接的方案就是把所有的可能發(fā)生的情況都考慮到叶洞。然后使用條件語句(if...elseif...elseif......else)對不同情況的作出判斷并進行處理余掖。但是假如狀態(tài)比較復雜寸爆,就會出現(xiàn)多個判斷語句,判斷語句中又包含這各種操作盐欺,這顯然是不受歡迎的赁豆。狀態(tài)模式的出現(xiàn)就是為了解決這種問題。
2.啥是狀態(tài)模式冗美?
狀態(tài)模式用于解決系統(tǒng)中復雜對象的狀態(tài)轉換以及不同狀態(tài)下行為的封裝問題魔种,將一個對象的狀態(tài)從該對象中分離出來,封裝到專門的狀態(tài)類中粉洼,使得對象狀態(tài)可以靈活變化节预。
狀態(tài)模式:允許一個對象在其內部狀態(tài)改變時改變它的行為,即不同的狀態(tài)對應了不同的行為属韧。對象看起來似乎修改了它的類安拟。很多情況下,一個對象的行為取決于一個或者多個動態(tài)變化的屬性宵喂。這樣的屬性叫做狀態(tài)糠赦,這樣的對象叫做有狀態(tài)的對象。其狀態(tài)是從事先定義好的一系列值中取出的樊破。當一個這樣的對象與外部事件產(chǎn)生互動時愉棱,其內部狀態(tài)就會改變,從而使得系統(tǒng)的行為也隨之改變哲戚。
概括如下:
1奔滑、狀態(tài)模式的優(yōu)點是結構清晰,相比于if…else…簡約了不少顺少;
2朋其、封裝性好,外部調用不必知道內部實現(xiàn)細節(jié)脆炎。
3.狀態(tài)模式的優(yōu)點梅猿?
狀態(tài)模式的好處是將與特定狀態(tài)相關的行為局部化,并且將不同狀態(tài)的行為分割開來。[DP]就是將特定的狀態(tài)相關的行為都放入一個對象中歪脏,由于所有與狀態(tài)相關的代碼都存在于某個ConcretState中版述,所以通過定義新的子類可以很容易的增加新的狀態(tài)和轉換[DP]铸本。這樣做的目的就是為了消除龐大的條件分支語句喇潘,大的分支判斷會使得它們難以修改和擴展体斩。狀態(tài)模式通過把各種狀態(tài)轉移邏輯分不到State的子類之間,來減少相互之間的依賴颖低。
4.狀態(tài)模式應用場景
什么時候需要考慮使用狀態(tài)模式呢絮吵?當一個對象的行為取決于它的狀態(tài),并且它必須在運行時刻根據(jù)狀態(tài)改變它的行為忱屑,就可以使用狀態(tài)模式蹬敲。另外,如果業(yè)務需求某項業(yè)務有多個狀態(tài)莺戒,通常都是一些枚舉常量伴嗡,狀態(tài)的變化都是依靠大量的分支判斷語句來實現(xiàn),此時應該考慮將每一種業(yè)務狀態(tài)定義為一個State子類脏毯,這樣這些對象就可以不依賴于其他對象而獨立變化了闹究,如果某天客戶需求改了,增加或減少業(yè)務狀態(tài)或改變狀態(tài)流程食店,都不是困難了渣淤。
概括如下:
行為狀態(tài)改變的場景。這點在各種控制器中非常常見吉嫩,同時价认,邏輯結構為狀態(tài)轉移圖的場景中都非常適用。
比如電梯樓層停/開門/走控制了自娩,比如糖果機器投幣賣糖果了用踩,比如自動開關門了,等等忙迁。
5.狀態(tài)模式的缺點脐彩?
在狀態(tài)比較多時,子類也會非常多姊扔,不便于管理惠奸。
6.舉個栗子(不用狀態(tài)模式和用狀態(tài)模式對比)
1)不用狀態(tài)模式的時候
這個類中的flow方法過長,而且有很多判斷分支恰梢,意味著它的責任過大了佛南。面向對象設計其實就是希望做到代碼的責任分解。所以這個類違背了單一職責原則嵌言;
此外嗅回,flow方法里有這么多判斷,使得任何需求的改動或增加摧茴,都需要去更改這個方法绵载。所以這個類也違背了開放-封閉原則;
2)用狀態(tài)模式的時候
3)增加條件了
假設老板說今天版本要上線,要球22:00到24:00過來加班尘分,
修改對比如下