亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#學習筆記之狀態模式詳解

2019-10-29 21:07:13
字體:
來源:轉載
供稿:網友

本文通過例題為大家講解C#學習筆記之狀態模式,供大家參考,具體內容如下

題目1:通過代碼描述每一天的不同時間段的工作效率

分析:

  首先確定,工作狀態指正在工作,或者以及下班這些情況,而這些情況所受影響的因素包括:當前時間以及任務是否已經完成。所以在Work中需要兩個屬性:hour和finish。然后根據這兩個屬性直接判斷當前的工作狀態即可。

實現:

class Program  {    static void Main(string[] args)    {      //緊急項目      Work emergencyProject = new Work();      emergencyProject.Hour = 9;      emergencyProject.WriteProgram();      emergencyProject.Hour = 10;      emergencyProject.WriteProgram();      emergencyProject.Hour = 12;      emergencyProject.WriteProgram();      emergencyProject.Hour = 13;      emergencyProject.WriteProgram();      emergencyProject.Hour = 14;      emergencyProject.WriteProgram();      emergencyProject.Hour = 17;      emergencyProject.Finish = false;      emergencyProject.WriteProgram();      emergencyProject.Hour = 19;      emergencyProject.WriteProgram();      emergencyProject.Hour = 22;      emergencyProject.WriteProgram();      Console.Read();    }    public class Work    {      private int hour;      private bool finish = false;      public int Hour      {        get { return hour; }        set { hour = value; }      }      public bool Finish      {        get { return finish; }        set { finish = value; }      }      /// <summary>      /// 根據時間來判斷當前的工作狀態如何      ///       /// 方法過長      /// </summary>      public void WriteProgram()      {        if (hour < 12)        {          Console.WriteLine("當前時間:{0}點 上午工作,精神百倍", hour);        }        else if (hour < 13)        {          Console.WriteLine("當前時間:{0}點 餓了,午飯;犯困,午休", hour);        }        else if (hour < 17)        {          Console.WriteLine("當前時間:{0}點 下午狀態還不錯,繼續努力", hour);        }        else        {          if (finish)          {            Console.WriteLine("當前時間:{0}點 下班回家了", hour);          }          else          {            if (hour < 21)            {              Console.WriteLine("當前時間:{0}點 加班哦,疲憊至極", hour);            }            else            {              Console.WriteLine("當前時間:{0}點 不行了,睡著了。", hour);            }          }        }      }    }  }

題目2:從1中可以很明顯的看出WriteProgram()函數幾乎承載了所有的判斷處理,且函數函數過長,所以在Work類中違背了“單一職責原則"。

分析:

  面向對象設計就是希望做到代碼的責任分解,在這個情況中,我們將所有的判斷全部添加在了WriteProgram()一個函數中,不僅是函數冗長,如果我臨時添加新的情況,可能對原來判斷有出入的時間也會造成很多麻煩,對于將來的修改百害而無一利。

  所以我們需要根據情況來分解函數和類。

  本題目中,我們需要獲得當前的工作狀態,而這個的直接影響因素包括時間Hour和是否已經完成任務TaskFinished。

  所以我們根據當前的時間可以很明顯的分為不同時間段,也就是WriteProgram()的if,else都可以自己單獨擁有一個類,他們都繼承于同一個抽象類State即可。

  然后我們初始化直接進入ForenoonState類,畢竟每天早上的時間不會變,如果當前時間不再是早上,那么我們就需要進入下一個時間段進行判斷,所以在ForenoonState類中我們需要加入判斷,如果當前時間滿足早上的時間段,顯示工作狀態,如果當前時間不再是早上的時間段,那么我們進入下一個時間段,以此類推,找到我們當前時間段的工作狀態。

C#,狀態模式

實現:

class Program  {    static void Main(string[] args)    {      //緊急項目      Work emergencyProject = new Work();      emergencyProject.Hour = 9;      emergencyProject.WriteProgram();      emergencyProject.Hour = 10;      emergencyProject.WriteProgram();      emergencyProject.Hour = 12;      emergencyProject.WriteProgram();      emergencyProject.Hour = 13;      emergencyProject.WriteProgram();      emergencyProject.Hour = 14;      emergencyProject.WriteProgram();      emergencyProject.Hour = 17;      emergencyProject.TaskFinished = false;      emergencyProject.WriteProgram();      emergencyProject.Hour = 19;      emergencyProject.WriteProgram();      emergencyProject.Hour = 22;      emergencyProject.WriteProgram();      Console.Read();    }    public class Work    {      private int hour;      private bool finish = false;      private State current;      //初始化進入的時候是上午工作狀態      public Work()      {        current = new ForenoonState();      }      public int Hour      {        get { return hour; }        set { hour = value; }      }      public bool TaskFinished      {        get { return finish; }        set { finish = value; }      }      public void SetState(State s)      {        current = s;      }      public void WriteProgram()      {        current.WriteProgram(this);      }    }    /// <summary>    /// 抽象狀態    /// </summary>    public abstract class State    {      public abstract void WriteProgram(Work w);    }    /// <summary>    /// 上午工作狀態    ///     /// 邏輯是:根據時間推移,上午工作后,移至中午午飯時間    /// </summary>    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();        }      }    }    /// <summary>    /// 中午工作狀態    ///     /// 邏輯是:根據時間推移,午休時間后,移至下午工作時間    /// </summary>    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();        }      }    }    /// <summary>    /// 下午工作狀態    ///     /// 邏輯是:根據時間推移,下午工作后,移至晚間工作狀態    /// </summary>    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();        }      }    }    /// <summary>    /// 晚間工作狀態    ///     /// 邏輯是:已完成工作的可以準點下班,移至下班休息狀態    ///     未完成工作的繼續加班:這里又分為未超過人體承受能力的(21小時)就繼續加班(此處已是最底層,沒有再多加其他的操作了)    ///                超過21小時的將移至睡眠狀態    /// </summary>    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();          }        }      }    }    /// <summary>    /// 睡眠狀態    ///     /// 最底層,不要再次調用,會無限往復的    /// </summary>    public class SleepingState : State    {      public override void WriteProgram(Work w)      {        Console.WriteLine("當前時間:{0}點 不行了,睡著了", w.Hour);      }    }    /// <summary>    /// 下班休息狀態    ///     /// 最底層,不要再次調用,會無限往復的    /// </summary>    public class RestState : State    {      public override void WriteProgram(Work w)      {        if (w.TaskFinished)        {          Console.WriteLine("當前時間:{0}點 下班回家", w.Hour);        }      }    }  }

總結:

  這里用到的就是狀態模式(State):當一個對象的內在狀態改變時,允許改變其行為,這個對象看起來像是改變了其類。

  狀態模式主要解決的是當控制一個對象狀態轉換的調節表達式過于復雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以吧復雜的判斷邏輯簡化。

  狀態模式的好處是將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。 

注:文中所有代碼及知識點均來自于《大話設計模式》,本人屬于邊學邊看邊敲代碼邊總結的階段。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美电影电视剧在线观看| 揄拍成人国产精品视频| 国产久一一精品| 自拍偷拍亚洲在线| 97精品视频在线播放| 亚洲激情电影中文字幕| 国产精品高潮呻吟久久av无限| 精品国产乱码久久久久久天美| 亚洲视屏在线播放| 久久精品国产一区二区电影| 亚洲精品综合久久中文字幕| 国产精品va在线播放| 色www亚洲国产张柏芝| 精品av在线播放| 九九热精品在线| 欧美专区在线播放| 91国在线精品国内播放| 成人免费网站在线观看| 亚洲人成在线免费观看| 亚洲午夜未删减在线观看| 国产丝袜视频一区| 一个人看的www久久| 美女av一区二区| 成人午夜在线视频一区| 日韩在线观看免费高清| 欧美高清一级大片| 欧美激情中文字幕乱码免费| 欧美激情视频在线观看| 亚洲自拍偷拍色图| 欧美精品电影免费在线观看| 欧美尺度大的性做爰视频| 国产欧美日韩免费| 国产精品久久久久av免费| 久久免费少妇高潮久久精品99| 日韩av日韩在线观看| 激情懂色av一区av二区av| 欧美日韩亚洲视频一区| 国产精品老牛影院在线观看| 欧美成人在线网站| 欧美在线观看日本一区| 日韩有码片在线观看| 久精品免费视频| 精品国产老师黑色丝袜高跟鞋| 丁香五六月婷婷久久激情| 日韩免费中文字幕| 精品国产一区二区在线| 91精品久久久久久久久不口人| 中文字幕国产精品久久| 欧美精品免费在线观看| 91精品国产综合久久香蕉922| 2019最新中文字幕| 美女少妇精品视频| 欧美日韩免费网站| 欧美国产日韩一区二区三区| www.日韩欧美| 国内精品久久久久久影视8| 欧美人成在线视频| 国产精品视频成人| 亚洲精品一区av在线播放| 日韩在线观看免费av| 岛国av一区二区三区| 最新中文字幕亚洲| 亚洲新声在线观看| 国产精品免费视频xxxx| 国产成人精品视频在线观看| 午夜精品美女自拍福到在线| 91精品久久久久久久久久久久久| 2021国产精品视频| 日韩av在线免费| 精品国内产的精品视频在线观看| 麻豆国产精品va在线观看不卡| 国产69精品99久久久久久宅男| 精品亚洲永久免费精品| 欧美亚洲一级片| 欧美日韩亚洲天堂| 成人国产精品av| 在线看福利67194| 国内精品久久久久影院 日本资源| 米奇精品一区二区三区在线观看| www.日韩不卡电影av| 91高清免费在线观看| www.欧美三级电影.com| 日本久久久久亚洲中字幕| 亚洲一区中文字幕| 狠狠色香婷婷久久亚洲精品| 亚洲二区中文字幕| 91亚洲国产成人精品性色| 久久精品一区中文字幕| 一本一本久久a久久精品牛牛影视| 国产精品久久久久久久天堂| 欧美xxxx做受欧美.88| 国产一区二区丝袜| 亚洲电影免费在线观看| 亚洲国产黄色片| 久久精品国产亚洲一区二区| www.亚洲男人天堂| 欧美丰满少妇xxxxx| 97久久久免费福利网址| 欧美性视频精品| 亚洲永久在线观看| 欧美视频第一页| 日韩欧美中文字幕在线观看| 韩曰欧美视频免费观看| 精品福利视频导航| 不卡伊人av在线播放| 综合网日日天干夜夜久久| 国产精品丝袜白浆摸在线| 精品在线观看国产| 影音先锋欧美在线资源| 精品亚洲一区二区三区在线播放| 日韩欧美国产视频| 在线成人免费网站| 欧美成人午夜剧场免费观看| 国产精品1区2区在线观看| 欧洲一区二区视频| 精品人伦一区二区三区蜜桃免费| 色婷婷综合久久久久| 91精品国产综合久久香蕉最新版| 中文字幕av一区二区三区谷原希美| 亚洲一区二区三区sesese| 国产91在线高潮白浆在线观看| 5252色成人免费视频| 国产日韩中文字幕在线| 深夜福利亚洲导航| 国产视频在线一区二区| 亚洲国产天堂网精品网站| 色婷婷综合久久久久中文字幕1| 欧美在线视频观看免费网站| 亚洲自拍偷拍在线| 亚洲欧美日韩另类| 亚洲成人动漫在线播放| 亚洲视频国产视频| 亚洲欧美日韩一区在线| 97国产精品视频人人做人人爱| 日韩中文字幕不卡视频| 亚洲www在线观看| 久久中文字幕国产| 欧美亚洲视频在线观看| 国产精品一区电影| 亚洲成年人影院在线| 上原亚衣av一区二区三区| 国产精品激情av在线播放| 日韩欧美精品免费在线| 粉嫩老牛aⅴ一区二区三区| 国产精品男女猛烈高潮激情| 一本色道久久88综合亚洲精品ⅰ| 在线观看日韩www视频免费| 永久免费看mv网站入口亚洲| 久久久www成人免费精品张筱雨| 成人午夜激情免费视频| 国产婷婷97碰碰久久人人蜜臀| 91精品综合久久久久久五月天| 日本91av在线播放| 色99之美女主播在线视频| 精品中文字幕久久久久久| 日韩欧美一区二区三区久久| 国产97免费视| 欧美日韩国产专区| 欧美电影在线观看| 国产精品久久综合av爱欲tv| 欧美孕妇性xx| 5566日本婷婷色中文字幕97| 欧美日韩亚洲国产一区| 国产精品普通话|