C#学习笔记之状态模式详解

2019-12-30 19:01:40于丽

本文通过例题为大家讲解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()一个函数中,不仅是函数冗长,如果我临时添加新的情况,可能对原来判断有出入的时间也会造成很多麻烦,对于将来的修改百害而无一利。