最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#學(xué)習(xí)筆記之狀態(tài)模式詳解

 更新時間:2017年11月17日 16:33:35   作者:可達鴨要進化  
這篇文章主要為大家詳細介紹了C#學(xué)習(xí)筆記之狀態(tài)模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文通過例題為大家講解C#學(xué)習(xí)筆記之狀態(tài)模式,供大家參考,具體內(nèi)容如下

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

分析:

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

實現(xiàn):

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>
      /// 根據(jù)時間來判斷當前的工作狀態(tài)如何
      /// 
      /// 方法過長
      /// </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}點 下午狀態(tài)還不錯,繼續(xù)努力", hour);
        }
        else
        {
          if (finish)
          {
            Console.WriteLine("當前時間:{0}點 下班回家了", hour);
          }
          else
          {
            if (hour < 21)
            {
              Console.WriteLine("當前時間:{0}點 加班哦,疲憊至極", hour);
            }
            else
            {
              Console.WriteLine("當前時間:{0}點 不行了,睡著了。", hour);
            }
          }
        }
      }
    }
  }

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

分析:

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

  所以我們需要根據(jù)情況來分解函數(shù)和類。

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

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

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

實現(xiàn):

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;
      //初始化進入的時候是上午工作狀態(tài)
      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>
    /// 抽象狀態(tài)
    /// </summary>
    public abstract class State
    {
      public abstract void WriteProgram(Work w);
    }
    /// <summary>
    /// 上午工作狀態(tài)
    /// 
    /// 邏輯是:根據(jù)時間推移,上午工作后,移至中午午飯時間
    /// </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>
    /// 中午工作狀態(tài)
    /// 
    /// 邏輯是:根據(jù)時間推移,午休時間后,移至下午工作時間
    /// </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>
    /// 下午工作狀態(tài)
    /// 
    /// 邏輯是:根據(jù)時間推移,下午工作后,移至晚間工作狀態(tài)
    /// </summary>
    public class AfternoonState : State
    {
      public override void WriteProgram(Work w)
      {
        if (w.Hour < 17)
        {
          Console.WriteLine("當前時間:{0} 下午狀態(tài)還不錯,繼續(xù)努力", w.Hour);
        }
        else
        {
          w.SetState(new EveningState());
          w.WriteProgram();
        }
      }
    }
    /// <summary>
    /// 晚間工作狀態(tài)
    /// 
    /// 邏輯是:已完成工作的可以準點下班,移至下班休息狀態(tài)
    ///     未完成工作的繼續(xù)加班:這里又分為未超過人體承受能力的(21小時)就繼續(xù)加班(此處已是最底層,沒有再多加其他的操作了)
    ///                超過21小時的將移至睡眠狀態(tài)
    /// </summary>
    public class EveningState : State
    {
      public override void WriteProgram(Work w)
      {
        if (w.TaskFinished)
        {
          w.SetState(new RestState());
          w.WriteProgram();
        }
        else
        {
          //最底層,不要再次調(diào)用,會無限往復(fù)的
          if (w.Hour < 21)
          {
            Console.WriteLine("當前時間:{0} 加班哦,疲憊至極", w.Hour);
          }
          else
          {
            w.SetState(new SleepingState());
            w.WriteProgram();
          }
        }
      }
    }
    /// <summary>
    /// 睡眠狀態(tài)
    /// 
    /// 最底層,不要再次調(diào)用,會無限往復(fù)的
    /// </summary>
    public class SleepingState : State
    {
      public override void WriteProgram(Work w)
      {
        Console.WriteLine("當前時間:{0}點 不行了,睡著了", w.Hour);
      }
    }
    /// <summary>
    /// 下班休息狀態(tài)
    /// 
    /// 最底層,不要再次調(diào)用,會無限往復(fù)的
    /// </summary>
    public class RestState : State
    {
      public override void WriteProgram(Work w)
      {
        if (w.TaskFinished)
        {
          Console.WriteLine("當前時間:{0}點 下班回家", w.Hour);
        }
      }
    }
  }

總結(jié):

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

  狀態(tài)模式主要解決的是當控制一個對象狀態(tài)轉(zhuǎn)換的調(diào)節(jié)表達式過于復(fù)雜時的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同狀態(tài)的一系列類當中,可以吧復(fù)雜的判斷邏輯簡化。

  狀態(tài)模式的好處是將與特定狀態(tài)相關(guān)的行為局部化,并且將不同狀態(tài)的行為分割開來。 

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#獲取機器碼的方法詳解(機器名,CPU編號,硬盤編號,網(wǎng)卡mac等)

    C#獲取機器碼的方法詳解(機器名,CPU編號,硬盤編號,網(wǎng)卡mac等)

    這篇文章主要介紹了C#獲取機器碼的方法,結(jié)合實例形式詳細分析了C#獲取硬件機器名、CPU編號、硬盤編號、網(wǎng)卡mac等信息的相關(guān)實現(xiàn)方法,需要的朋友可以參考下
    2016-07-07
  • C#多線程編程中的鎖系統(tǒng)(二)

    C#多線程編程中的鎖系統(tǒng)(二)

    這篇文章主要介紹了C#多線程編程中的鎖系統(tǒng)(二),本文講解了volatile、Interlocked、ReaderWriterLockSlim等升級鎖和原子操作的使用實例,需要的朋友可以參考下
    2015-04-04
  • c#讀寫注冊表示例分享

    c#讀寫注冊表示例分享

    這篇文章主要介紹了c#讀寫注冊表示例,示例中有詳細注釋,大家參考使用吧
    2014-01-01
  • C#多線程系列之手動線程通知

    C#多線程系列之手動線程通知

    本文詳細講解了C#多線程中的手動線程通知,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • WPF+DiffPlex實現(xiàn)文本比對工具

    WPF+DiffPlex實現(xiàn)文本比對工具

    現(xiàn)行的文本編輯器大多都具備文本查詢的能力,但是并不能直觀的告訴用戶兩段文字的細微差異,所以對比工具在某種情況下,就起到了很便捷的效率。本文將利用DiffPlex實現(xiàn)簡易的文本比對工具,需要的可以參考一下
    2022-11-11
  • C#使用位域技術(shù)進行對象二進制序列化優(yōu)

    C#使用位域技術(shù)進行對象二進制序列化優(yōu)

    在操作系統(tǒng)中,進程信息對于系統(tǒng)監(jiān)控和性能分析至關(guān)重要,這個過程中,如何將捕獲到的進程對象轉(zhuǎn)換為二進制數(shù)據(jù),并進行優(yōu)化,以減小數(shù)據(jù)包的大小,成為了一個關(guān)鍵問題,下面我們就來看看如何使用位域技術(shù)對C#對象進行二進制序列化優(yōu)化吧
    2024-01-01
  • C#中DataSet轉(zhuǎn)化為實體集合類的方法

    C#中DataSet轉(zhuǎn)化為實體集合類的方法

    這篇文章主要介紹了C#中DataSet轉(zhuǎn)化為實體集合類的方法,是非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • C# 鍵盤Enter鍵取代Tab鍵實現(xiàn)代碼

    C# 鍵盤Enter鍵取代Tab鍵實現(xiàn)代碼

    這篇文章主要介紹了C# 鍵盤Enter鍵取代Tab鍵實現(xiàn)代碼,有需要的朋友可以參考一下
    2013-11-11
  • C# webclient中文亂碼問題解決方法

    C# webclient中文亂碼問題解決方法

    本文介紹使用webclient抓取遠程頁面出現(xiàn)亂碼的處理方法,希望對大家有所幫助。
    2016-05-05
  • Windows窗體的.Net框架繪圖技術(shù)實現(xiàn)方法

    Windows窗體的.Net框架繪圖技術(shù)實現(xiàn)方法

    這篇文章主要介紹了Windows窗體的.Net框架繪圖技術(shù)實現(xiàn)方法,非常實用,需要的朋友可以參考下
    2014-08-08

最新評論

泰安市| 延吉市| 临海市| 达日县| 密山市| 宁武县| 遵义市| 铁力市| 澜沧| 福泉市| 涟源市| 德兴市| 锡林郭勒盟| 皮山县| 垦利县| 灌云县| 独山县| 枣强县| 舒城县| 禄丰县| 资源县| 德江县| 昂仁县| 革吉县| 海口市| 灵石县| 西乌| 金秀| 盐池县| 甘泉县| 崇信县| 和政县| 新田县| 建平县| 通州区| 桂阳县| 安平县| 郓城县| 汉源县| 南皮县| 西丰县|