日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式行为型-状态模式

發布時間:2023/12/20 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式行为型-状态模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近學習了設計模式行為型中的狀態模式,這個模式的就完全體現出“多態”這種性質了,首先是它的解釋:當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。

為什么說狀態模式就體現出多態?在圖上可以看出具體對象對應的狀態行為有多個,而這個狀態行為是由什么決定去使用呢?

主要還是通過具體對象Context這個對象的屬性值的變化,通過屬性值的變化我去執行一個操作(行為)時,決定使用下面三個狀態行為哪一個。

在大話設計模式這本書中給狀態模式舉例說明的那個例子就很形象,同樣一個行為,在時間不一樣的時候展現出的效果是不一樣的,這里的時間就是我們具體對象的屬性(狀態),對應到狀態模式的解釋中就是狀態改變,而后者行為就是那個具體的動作,但是狀態發生變化后他就也被改變了。

那么總結一下,這個狀態模式的多態在具體的對象中體現出來的就是一個方法的實現,在不同屬性(狀態)下展現出來的行為是不一樣的,而且這個狀態模式的適用環境是一個相對確定的業務,如果想要對一個對象添加新的狀態,那么這個具體的狀態類只能放到原本第一個具體的狀態類前面的位置,就像棧一樣,這種情況下是屬于可擴展的,但是相對于職責鏈的在外部設置上下級的這種方式還是有局限的。不過我相信還是有其他的符合開閉原則的方法來支持它的擴展性的。如果有的話希望各位不吝賜教,感謝

具體代碼是根據書中例子來

抽象狀態:

public abstract class State{public abstract void WriteProgram(Work w);}

具體狀態行為:

//上午工作狀態public class ForenoonState : State{public override void WriteProgram(Work w){ //這里的判斷就是決定要用那種行為展現出來,如果 不符合當前狀態,那么就去到已經設置好的下一個具體狀態類中進行相同的操作。if (w.Hour < 12){Console.WriteLine("當前時間:{0}點 上午工作,精神百倍",w.Hour);}else{w.SetState(new NoonState());w.WriteProgram();}}}//中午工作狀態public class NoonState : State{public override void WriteProgram(Work w){if (w.Hour < 13){Console.WriteLine("當前時間:{0}點 餓了,想吃飯;犯困,想睡覺。", w.Hour);}else{w.SetState(new AfternoonState()); w.WriteProgram();}}}//下午工作狀態public class AfternoonState : State{public override void WriteProgram(Work w){if (w.Hour < 17){Console.WriteLine("當前時間:{0}點 下午狀態還不錯,繼續努力", w.Hour);}else{w.SetState(new EveningState()); w.WriteProgram();}}}//晚上工作狀態public class EveningState : State{public override void WriteProgram(Work w){if (w.TaskFinished){w.SetState(new RestState());w.WriteProgram();//完成任務就轉成下班狀態}else{if (w.Hour <21){Console.WriteLine("當前時間:{0}點 加班了,加班人累啊", w.Hour);}else {w.SetState(new SleepingState()); w.WriteProgram();//超過21點,轉入睡眠狀態}}}}//睡眠狀態public class SleepingState:State{public override void WriteProgram(Work w){Console.WriteLine("當前時間:{0}點 不行了,睡著了", w.Hour);}}//下班休息狀態public class RestState : State{public override void WriteProgram(Work w){Console.WriteLine("當前時間:{0}點 不行了,睡著了", w.Hour);}}

具體工作類:

public class Work{private State current;public Work(){current = new ForenoonState(); //初始化為上午9點開始上班}private double hour;public double Hour //小時鐘,狀態轉換的依據{get { return hour; }set { hour = value; }}private bool finish = false;public bool TaskFinished //完成任務屬性,是否能下班的依據{get { return finish; }set { finish = value; }} //這個方法主要就是把具體的狀態類給進來,然后讓下面的方法去使用public void SetState(State s) //得到狀態{current = s;} //下面這個方法從始至終都沒有發生改變,改變是其內部具體的展現值。public void WriteProgram() {current.WriteProgram(this);}}

總結

以上是生活随笔為你收集整理的设计模式行为型-状态模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。