標簽: 設(shè)計模式初涉
描述性文字
分離狀態(tài),選擇實現(xiàn)
定義
當一個對象的內(nèi)在狀態(tài)發(fā)生改變時允許改變其行為磅叛,這個對象看起來像是改變了它的類
三個角色
- Context:上下文環(huán)境残邀,定義客戶感興趣的接口皆辽,維護一個State子類的實例,該實例定義了對象的當前狀態(tài)
- State:抽象狀態(tài)罐旗,定義一個接口以封裝與 Context 的一個特定狀態(tài)相關(guān)的行為膳汪。
- ConcreteState:具體狀態(tài),實現(xiàn)抽象狀態(tài)中定義的接口九秀,從而達到不同狀態(tài)下的不同行為遗嗽。
UML類圖
使用場景
- 1.對象的行為依賴于它的狀態(tài)(屬性)并且可以根據(jù)它的狀態(tài)改變而改變它的相關(guān)行為;
- 2.代碼中包含大量與對象狀態(tài)有關(guān)的條件語句
優(yōu)缺點
優(yōu)點
- 1.簡化應(yīng)用邏輯控制鼓蜒,減少依賴于狀態(tài)的if-else
- 2.更好的分離狀態(tài)和行為
- 3.更好的擴展性痹换,擴展新的狀態(tài)只需增加實現(xiàn)類,在需要維護的地方設(shè)置新狀態(tài)即可
- 4.顯式化進行狀態(tài)轉(zhuǎn)換
缺點
- 1.類文件增加
- 2.邏輯分散都弹,無法再一個地方就看出整個狀態(tài)機的邏輯
示例代碼
狀態(tài)模式非常簡單娇豫,就是抽象出狀態(tài)State,然后實現(xiàn)該接口畅厢,然后具體化不同狀態(tài)冯痢,
做不同的操作,然后寫一個Context框杜,里面存儲一個State的實例浦楣,然后定義一個
可以修改State實例的方法,并在里面去調(diào)用實例的行為方法咪辱。寫個不同時刻做
不同事情的例子幫助理解下~
先定義抽象狀態(tài)
三個具體狀態(tài)振劳,早上睡懶覺,下午學(xué)習(xí)油狂,晚上打球
然后是Context類历恐,就寫一個設(shè)置State的方法
最后客戶端調(diào)用下
輸出結(jié)果
好的寸癌,狀態(tài)模式還是非常簡單的,可能細心的你發(fā)現(xiàn)了狀態(tài)模式和策略模式非常的類似弱贼,
其實還是有些不同的蒸苇,比如Context類,策略模式只是一個委托作用哮洽,負責(zé)算法替換填渠;而狀態(tài)模式
不僅僅是委托作用,還具有等級狀態(tài)變化的功能鸟辅,與具體的狀態(tài)類協(xié)作氛什,共同完成狀態(tài)切換的任務(wù)。
策略模式封裝的是不同算法匪凉,算法間沒有交互枪眉,已達到算法可以自由切換的目的;
狀態(tài)模式封裝的是不同狀態(tài)再层,以達到狀態(tài)切換行為隨之發(fā)生改變的目的贸铜。
本節(jié)代碼示例
https://github.com/coder-pig/DesignPatternsExample/tree/master/22.State%20Pattern