定義:
狀態(tài)模式(State),當(dāng)一個(gè)對象的內(nèi)在狀態(tài)改變時(shí),允許改變其行為,這個(gè)對象看起來像是改變了其類。
一個(gè)方法過長就是代碼的壞味道。這個(gè)類或者這個(gè)方法違背類“單一職責(zé)原則”。
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對象狀態(tài)轉(zhuǎn)換的體檢表達(dá)式過于復(fù)雜的時(shí)的情況,把狀態(tài)的判斷邏輯轉(zhuǎn)移到不同的狀態(tài)的一系列類當(dāng)中,可以把復(fù)雜的判斷邏輯化。當(dāng)然,如果這個(gè)判斷很簡單,那就沒必要用“狀態(tài)模式”了。
我們看到UML類圖中,context類中維護(hù)者一個(gè)State的引用,也就是說,我們使用context類就可以控制State的具體實(shí)現(xiàn)的變化。
而具體實(shí)現(xiàn)類中有著傳遞一個(gè)Context的飲用的方法。實(shí)際上是將Context 這個(gè)對象一致傳遞下去。
狀態(tài)模式的好處是:將與特定的狀態(tài)相關(guān)的行為局部化,并且將不同狀態(tài)的行為分割開來。
也就是將特定的狀態(tài)相關(guān)的行為都放入一個(gè)對象中,由于所有與狀態(tài)相關(guān)的代碼都存在于某個(gè)ConcreaeState中,所以通過定義新的子類可以很容易地增加新的狀態(tài)和轉(zhuǎn)換。
說白了,這樣做的目的就是為零消除龐大的條件分枝語句,大的分支判斷會(huì)使得他們那一修改和擴(kuò)展。就像我們門最早說的刻板印刷一樣,任何改動(dòng)和變化都是致命的,狀態(tài)模式通過把各種狀態(tài)轉(zhuǎn)移邏輯分布到State的子類之間,來減少相互間的依賴。
使用場景:
當(dāng)一個(gè)對象的行為取決于他的狀態(tài),并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為時(shí),就可以考慮使用狀態(tài)模式了。而狀態(tài)模式也是消滅if else 的利器