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

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

  所以我们需要根据情况来分解函数和类。

  本题目中,我们需要获得当前的工作状态,而这个的直接影响因素包括时间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);
        }
      }
    }
  }