狀態(tài)模式是行為型模式的一種假瞬,同時屬于行為模式的還有:命令模式迂尝,觀察者模式,策略模式和之前寫的中介者模式垄开。
什么是狀態(tài)模式溉躲?使用場景
對象的行為依賴于它的狀態(tài)(屬性),并且可以根據(jù)它的狀態(tài)改變而改變它的相關(guān)行為锻梳。
在很多情況下,一個對象的行為取決于一個或多個動態(tài)變化的屬性疑枯,這樣的屬性叫做狀態(tài),這樣的對象叫做有狀態(tài)的對象,這樣的對象狀態(tài)是從事先定義好的一系列值中取出的国章。當(dāng)一個這樣的對象與外部事件產(chǎn)生互動時豆村,其內(nèi)部狀態(tài)就會改變,從而使得系統(tǒng)的行為也隨之發(fā)生變化
狀態(tài)模式的優(yōu)缺點
優(yōu)點:?封裝了轉(zhuǎn)換規(guī)則你画,將所有與某個狀態(tài)有關(guān)的行為放到一個類中桃漾,并且可以方便地增加新的狀態(tài),只需要改變對象狀態(tài)即可改變對象的行為适滓。 允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對象合成一體恋追,而不是某一個巨大的條件語句塊。
缺點:?狀態(tài)模式的使用必然會增加系統(tǒng)類和對象的個數(shù)苦囱。 狀態(tài)模式的結(jié)構(gòu)與實現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂鱼鸠。
策略模式和狀態(tài)模式的區(qū)別和聯(lián)系
區(qū)別:狀態(tài)模式將各個狀態(tài)所對應(yīng)的操作分離開來羹铅,即對于不同的狀態(tài),由不同的子類實現(xiàn)具體操作职员,不同狀態(tài)的切換由子類實現(xiàn),當(dāng)發(fā)現(xiàn)傳入?yún)?shù)不是自己這個狀態(tài)所對應(yīng)的參數(shù)扮授,則自己給Context類切換狀態(tài)专肪;而策略模式是直接依賴注入到Context類的參數(shù)進(jìn)行選擇策略,不存在切換狀態(tài)的操作牵祟。
聯(lián)系:狀態(tài)模式和策略模式都是為具有多種可能情形設(shè)計的模式,把不同的處理情形抽象為一個相同的接口咕晋,符合對擴(kuò)展開放,對修改封閉的原則掌呜。還有就是,策略模式更具有一般性一些势篡,在實踐中模暗,可以用策略模式來封裝幾乎任何類型的規(guī)則,只要在分析過程中聽到需要在不同實踐應(yīng)用不同的業(yè)務(wù)規(guī)則兑宇,就可以考慮使用策略模式處理,在這點上策略模式是包含狀態(tài)模式的功能的瓷产,策略模式是一個重要的設(shè)計模式枚驻。