狀態(tài)模式介紹
? ? 狀態(tài)模式和策略模式結(jié)構(gòu)幾乎一樣尝蠕,但它們的目的烘豌、本質(zhì)卻完全不一樣。
????狀態(tài)模式的行為是平行的看彼、不可替換的廊佩;
? ? 策略模式的行為是彼此獨(dú)立的、可相互替換的靖榕。
? ? 狀態(tài)模式的意圖是讓一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候标锄,其行為也隨之改變。
狀態(tài)模式定義
? ? 當(dāng)一個(gè)對(duì)象內(nèi)部狀態(tài)改變時(shí)允許改變其行為茁计,這個(gè)對(duì)象看起來(lái)像是改變了其類料皇。
狀態(tài)模式使用場(chǎng)景
? ? 1)一個(gè)對(duì)象的行為取決于它的狀態(tài),并且它必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變他的行為
? ? 2)代碼中包含大量與對(duì)象狀態(tài)有關(guān)的條件語(yǔ)句星压,例如践剂,一個(gè)操作中含有龐大的多分支語(yǔ)句(if-else或switch-case),并且這些分支依賴于改對(duì)象的狀態(tài)娜膘。
? ? 狀態(tài)模式將每一個(gè)條件分支放入一個(gè)獨(dú)立的類中逊脯,這使得你可以根據(jù)對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴與其他對(duì)象而獨(dú)立變化竣贪,這樣通過(guò)多態(tài)來(lái)去除過(guò)多的军洼、重復(fù)的if-else等分支語(yǔ)句。
狀態(tài)模式具體應(yīng)用
? ? 1)簡(jiǎn)單示例:電視的遙控器開(kāi)關(guān)機(jī)的狀態(tài)贾富,開(kāi)機(jī)狀態(tài)所有按鍵生效歉眷,關(guān)機(jī)狀態(tài)只有電源按鈕生效。這是在開(kāi)發(fā)電視盒子的時(shí)候可以用到颤枪。
? ? 2)Android原生應(yīng)用的wifi模塊也是使用狀態(tài)模式的汗捡,具體的就不介紹了,源碼內(nèi)容太多畏纲,感興趣的可以自己看下扇住。
? ? 3)在實(shí)際移動(dòng)開(kāi)發(fā)的登錄模塊,一般論壇類型的盗胀,例如新浪微博中艘蹋,用戶在未登錄的情況下點(diǎn)擊轉(zhuǎn)發(fā)按鈕,此時(shí)會(huì)讓用戶登錄票灰,然后再執(zhí)行轉(zhuǎn)發(fā)操作女阀。如果是已登錄的情況下宅荤,那么用戶輸入轉(zhuǎn)發(fā)的內(nèi)容后就可以直接進(jìn)行操作。
狀態(tài)模式小結(jié)
? ? 狀態(tài)模式的關(guān)鍵點(diǎn)在于不同的狀態(tài)下對(duì)于同一行為有不同的響應(yīng)浸策,這其實(shí)就是一個(gè)將if-else用多態(tài)來(lái)實(shí)現(xiàn)的一個(gè)具體實(shí)力冯键。它的實(shí)現(xiàn)原理就是將請(qǐng)求的處理封裝到狀態(tài)中,在不同的狀態(tài)類中對(duì)同一個(gè)請(qǐng)求進(jìn)行不同的處理庸汗。
優(yōu)點(diǎn):
? ? State模式將所有與一個(gè)特定的狀態(tài)相關(guān)的行為放入一個(gè)狀態(tài)對(duì)象中惫确,它提供了一個(gè)更好的方法來(lái)組織與特定狀態(tài)相關(guān)的代碼,將煩瑣的狀態(tài)判斷轉(zhuǎn)成結(jié)構(gòu)清晰的狀態(tài)類族蚯舱,在避免代碼膨脹的同時(shí)也保證了可擴(kuò)展性與可維護(hù)性改化。
缺點(diǎn):
? ? 狀態(tài)模式和其他幾個(gè)模式的共有缺點(diǎn)----隨著使用必然會(huì)增加系統(tǒng)類和對(duì)象的個(gè)數(shù)