狀態(tài)模式

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)模式的時候


image.png

這個類中的flow方法過長,而且有很多判斷分支恰梢,意味著它的責任過大了佛南。面向對象設計其實就是希望做到代碼的責任分解。所以這個類違背了單一職責原則嵌言;

此外嗅回,flow方法里有這么多判斷,使得任何需求的改動或增加摧茴,都需要去更改這個方法绵载。所以這個類也違背了開放-封閉原則;

2)用狀態(tài)模式的時候


image.png

3)增加條件了
假設老板說今天版本要上線,要球22:00到24:00過來加班尘分,

修改對比如下


image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末猜惋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子培愁,更是在濱河造成了極大的恐慌,老刑警劉巖缓窜,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件定续,死亡現(xiàn)場離奇詭異,居然都是意外死亡禾锤,警方通過查閱死者的電腦和手機私股,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恩掷,“玉大人倡鲸,你說我怎么就攤上這事』颇铮” “怎么了峭状?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逼争。 經(jīng)常有香客問我优床,道長,這世上最難降的妖魔是什么誓焦? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任胆敞,我火速辦了婚禮,結果婚禮上杂伟,老公的妹妹穿的比我還像新娘移层。我一直安慰自己,他們只是感情好赫粥,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布观话。 她就那樣靜靜地躺著,像睡著了一般傅是。 火紅的嫁衣襯著肌膚如雪匪燕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天喧笔,我揣著相機與錄音帽驯,去河邊找鬼。 笑死书闸,一個胖子當著我的面吹牛尼变,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼嫌术,長吁一口氣:“原來是場噩夢啊……” “哼哀澈!你這毒婦竟也來了?” 一聲冷哼從身側響起度气,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤割按,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磷籍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體适荣,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年院领,在試婚紗的時候發(fā)現(xiàn)自己被綠了弛矛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡比然,死狀恐怖丈氓,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情强法,我是刑警寧澤万俗,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站拟烫,受9級特大地震影響该编,放射性物質發(fā)生泄漏。R本人自食惡果不足惜硕淑,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一课竣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧置媳,春花似錦于樟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寥袭,卻和暖如春路捧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背传黄。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工杰扫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膘掰。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓章姓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凡伊,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • 今天我們來做一個糖果機吧零渐,用戶只需要投入25美分,就可以購買糖果了系忙,具體的構造如下圖所示: 每個圓圈都表示一種狀態(tài)...
    西木柚子閱讀 1,058評論 1 11
  • ??注意:如果不想浪費時間诵盼,請一定要點我。 ??在軟件開發(fā)過程中银还,應用程序中的有些對象可能會根據(jù)不同的情況做出不同...
    布魯斯理閱讀 254評論 0 0
  • 在軟件開發(fā)過程中拦耐,應用程序中的部分對象可能會根據(jù)不同的情況做出不同的行為,我們把這種對象稱為有狀態(tài)的對象见剩,而把影響...
    木子教程閱讀 676評論 0 1
  • 電梯具有的動作: 開門:乘客進入、出去扫俺。 關門:電梯準備開始運行苍苞。 運行:上下運行。 停止:停止運行狼纬。 1羹呵、先讓電...
    _心碎烏托邦_閱讀 437評論 0 0
  • 狀態(tài)模式的定義 定義:當一個對象內在狀態(tài)改變時允許其改變行為,這個對象看起來就像改變了其類疗琉。狀態(tài)模式的核心是封裝冈欢,...
    緩慢移動的蝸牛閱讀 303評論 0 0