狀態(tài)模式
狀態(tài)模式允許對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變其行為,使其看上去就像改變了自身所屬的類一樣。
狀態(tài)模式是為了把一大串if...else...的邏輯給分拆到不同的狀態(tài)類中,使得將來增加狀態(tài)比較容易。
狀態(tài)模式的關(guān)鍵設(shè)計(jì)思想在于狀態(tài)切換。簡單的狀態(tài)轉(zhuǎn)換可以直接由調(diào)用方指定,復(fù)雜的狀態(tài)轉(zhuǎn)換可以在內(nèi)部根據(jù)條件觸發(fā)完成。
狀態(tài)模式建議為對(duì)象的所有可能狀態(tài)新建一個(gè)類,然后將所有狀態(tài)的對(duì)應(yīng)行為抽取到這些類中。
當(dāng)對(duì)象的行為依賴于其狀態(tài),并且狀態(tài)之間的轉(zhuǎn)換復(fù)雜時(shí);當(dāng)代碼中存在大量的條件語句,并且這些條件語句依賴于對(duì)象的狀態(tài)時(shí),我們都可以使用狀態(tài)模式。
狀態(tài)模式通常有以下組成部分:
- 抽象狀態(tài)接口:聲明一個(gè)或多個(gè)方法,用于封裝具體狀態(tài)的行為。
- 具體狀態(tài)類:實(shí)現(xiàn)抽象狀態(tài)接口,根據(jù)不同的狀態(tài)實(shí)現(xiàn)具體的行為。
- 環(huán)境類:包含一個(gè)狀態(tài)對(duì)象的引用,并在狀態(tài)改變時(shí)更新其行為。
我們實(shí)現(xiàn)一個(gè)簡單的狀態(tài)模式。
1、抽象狀態(tài)類
2、具體狀態(tài)類
3、環(huán)境類
4、客戶端
狀態(tài)模式的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):
- 封裝狀態(tài)轉(zhuǎn)換:將狀態(tài)轉(zhuǎn)換邏輯封裝在狀態(tài)對(duì)象內(nèi)部,避免了復(fù)雜的條件判斷語句。
- 易于擴(kuò)展:增加新的狀態(tài)類不會(huì)影響現(xiàn)有代碼,符合開閉原則。
- 集中狀態(tài)相關(guān)行為:將所有與特定狀態(tài)相關(guān)的行為集中到一個(gè)類中,增強(qiáng)了代碼的可維護(hù)性。
缺點(diǎn):
- 增加類和對(duì)象數(shù)量:每個(gè)狀態(tài)都需要一個(gè)具體的狀態(tài)類,可能導(dǎo)致類的數(shù)量增加。
- 實(shí)現(xiàn)復(fù)雜:模式結(jié)構(gòu)和實(shí)現(xiàn)相對(duì)復(fù)雜,可能增加系統(tǒng)的復(fù)雜度。
狀態(tài)模式通過將狀態(tài)和行為封裝在獨(dú)立的類中,使得對(duì)象的行為隨著狀態(tài)的變化而變化,增強(qiáng)了系統(tǒng)的靈活性和可維護(hù)性。
狀態(tài)模式跟策略模式很相似,但有一個(gè)關(guān)鍵性的不同點(diǎn)——在狀態(tài)模式中,特定狀態(tài)是知道其他所有狀態(tài)的存在的,且能觸發(fā)從一個(gè)狀態(tài)到另一個(gè)狀態(tài)的轉(zhuǎn)換;而策略則幾乎是完全不知道其他策略的存在的。
他人犯錯(cuò),常有己過。-- 煙沙九洲
?
浙公網(wǎng)安備 33010602011771號(hào)