设计模式行为型-状态模式
最近學(xué)習(xí)了設(shè)計(jì)模式行為型中的狀態(tài)模式,這個模式的就完全體現(xiàn)出“多態(tài)”這種性質(zhì)了,首先是它的解釋:當(dāng)一個對象的內(nèi)在狀態(tài)改變時允許改變其行為,這個對象看起來像是改變了其類。
為什么說狀態(tài)模式就體現(xiàn)出多態(tài)?在圖上可以看出具體對象對應(yīng)的狀態(tài)行為有多個,而這個狀態(tài)行為是由什么決定去使用呢?
主要還是通過具體對象Context這個對象的屬性值的變化,通過屬性值的變化我去執(zhí)行一個操作(行為)時,決定使用下面三個狀態(tài)行為哪一個。
在大話設(shè)計(jì)模式這本書中給狀態(tài)模式舉例說明的那個例子就很形象,同樣一個行為,在時間不一樣的時候展現(xiàn)出的效果是不一樣的,這里的時間就是我們具體對象的屬性(狀態(tài)),對應(yīng)到狀態(tài)模式的解釋中就是狀態(tài)改變,而后者行為就是那個具體的動作,但是狀態(tài)發(fā)生變化后他就也被改變了。
那么總結(jié)一下,這個狀態(tài)模式的多態(tài)在具體的對象中體現(xiàn)出來的就是一個方法的實(shí)現(xiàn),在不同屬性(狀態(tài))下展現(xiàn)出來的行為是不一樣的,而且這個狀態(tài)模式的適用環(huán)境是一個相對確定的業(yè)務(wù),如果想要對一個對象添加新的狀態(tài),那么這個具體的狀態(tài)類只能放到原本第一個具體的狀態(tài)類前面的位置,就像棧一樣,這種情況下是屬于可擴(kuò)展的,但是相對于職責(zé)鏈的在外部設(shè)置上下級的這種方式還是有局限的。不過我相信還是有其他的符合開閉原則的方法來支持它的擴(kuò)展性的。如果有的話希望各位不吝賜教,感謝
具體代碼是根據(jù)書中例子來
抽象狀態(tài):
public abstract class State{public abstract void WriteProgram(Work w);}具體狀態(tài)行為:
//上午工作狀態(tài)public class ForenoonState : State{public override void WriteProgram(Work w){ //這里的判斷就是決定要用那種行為展現(xiàn)出來,如果 不符合當(dāng)前狀態(tài),那么就去到已經(jīng)設(shè)置好的下一個具體狀態(tài)類中進(jìn)行相同的操作。if (w.Hour < 12){Console.WriteLine("當(dāng)前時間:{0}點(diǎn) 上午工作,精神百倍",w.Hour);}else{w.SetState(new NoonState());w.WriteProgram();}}}//中午工作狀態(tài)public class NoonState : State{public override void WriteProgram(Work w){if (w.Hour < 13){Console.WriteLine("當(dāng)前時間:{0}點(diǎn) 餓了,想吃飯;犯困,想睡覺。", w.Hour);}else{w.SetState(new AfternoonState()); w.WriteProgram();}}}//下午工作狀態(tài)public class AfternoonState : State{public override void WriteProgram(Work w){if (w.Hour < 17){Console.WriteLine("當(dāng)前時間:{0}點(diǎn) 下午狀態(tài)還不錯,繼續(xù)努力", w.Hour);}else{w.SetState(new EveningState()); w.WriteProgram();}}}//晚上工作狀態(tài)public class EveningState : State{public override void WriteProgram(Work w){if (w.TaskFinished){w.SetState(new RestState());w.WriteProgram();//完成任務(wù)就轉(zhuǎn)成下班狀態(tài)}else{if (w.Hour <21){Console.WriteLine("當(dāng)前時間:{0}點(diǎn) 加班了,加班人累啊", w.Hour);}else {w.SetState(new SleepingState()); w.WriteProgram();//超過21點(diǎn),轉(zhuǎn)入睡眠狀態(tài)}}}}//睡眠狀態(tài)public class SleepingState:State{public override void WriteProgram(Work w){Console.WriteLine("當(dāng)前時間:{0}點(diǎn) 不行了,睡著了", w.Hour);}}//下班休息狀態(tài)public class RestState : State{public override void WriteProgram(Work w){Console.WriteLine("當(dāng)前時間:{0}點(diǎn) 不行了,睡著了", w.Hour);}}具體工作類:
public class Work{private State current;public Work(){current = new ForenoonState(); //初始化為上午9點(diǎn)開始上班}private double hour;public double Hour //小時鐘,狀態(tài)轉(zhuǎn)換的依據(jù){get { return hour; }set { hour = value; }}private bool finish = false;public bool TaskFinished //完成任務(wù)屬性,是否能下班的依據(jù){get { return finish; }set { finish = value; }} //這個方法主要就是把具體的狀態(tài)類給進(jìn)來,然后讓下面的方法去使用public void SetState(State s) //得到狀態(tài){current = s;} //下面這個方法從始至終都沒有發(fā)生改變,改變是其內(nèi)部具體的展現(xiàn)值。public void WriteProgram() {current.WriteProgram(this);}}總結(jié)
以上是生活随笔為你收集整理的设计模式行为型-状态模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。