设计模式笔记(十一) —— 状态模式

时间:2022-07-09 19:59:49

状态模式(State):当一个内在对象的状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态改变的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑化。
好处是将与特定状态的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关行为都放入一个对象中,由于所有与状态相关的代码都存在某个ConcreteState当中,所以通过定义新的子类可以很容易地增加新的状态和转换,消除了庞大的条件分支语句,状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。 

  1. using System;
  2. /**
  3.  * 状态模式(State):
  4.  *    当一个内在对象的状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态改变的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑化。
  5.  *    好处是将与特定状态的行为局部化,并且将不同状态的行为分割开来。将特定的状态相关行为都放入一个对象中,由于所有与状态相关的代码都存在某个ConcreteState当中,所以通过定义新的子类可以很容易地增加新的状态和转换,消除了庞大的条件分支语句,状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
  6.      当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
  7.  */
  8. namespace StuDesignMode.State
  9. {
  10.     #region 状态模式原始代码
  11.     //interface IState
  12.     //{
  13.     //    void Handle(Context context);    
  14.     //}
  15.     //class ConcreteStateA : IState
  16.     //{
  17.     //    public void Handle(Context context)
  18.     //    {
  19.     //        //设置A的下一状态是B
  20.     //        context.State = new ConcreteStateB();
  21.     //    }
  22.     //}
  23.     //class ConcreteStateB : IState
  24.     //{
  25.     //    public void Handle(Context context)
  26.     //    {
  27.     //        //设置B的下一状态是A
  28.     //        context.State = new ConcreteStateA();
  29.     //    }
  30.     //}
  31.     //class Context
  32.     //{
  33.     //    private IState _state;
  34.     //    public IState State
  35.     //    {
  36.     //        get { return this._state; }
  37.     //        set { this._state = value; Console.WriteLine("当前状态:",this._state.GetType().Name); }
  38.     //    }
  39.     //    public void Request()
  40.     //    {
  41.     //        this.State.Handle(this);
  42.     //    }
  43.     //}
  44.     #endregion
  45.     #region 模式示例
  46.     public interface IState
  47.     {
  48.         void WriteProgram(Work work);
  49.     }
  50.     /// <summary>
  51.     /// 上午状态
  52.     /// </summary>
  53.     public class ForenoonState : IState
  54.     {
  55.         public void WriteProgram(Work work)
  56.         {
  57.             if (work.Hour < 12)
  58.             {
  59.                 Console.WriteLine("当前时间:{0}点 上午工作,精神百倍!", work.Hour);
  60.             }
  61.             else
  62.             {
  63.                 work.CurrentState = new NoonState();
  64.                 work.WriteProgram();
  65.             }
  66.         }
  67.     }
  68.     /// <summary>
  69.     /// 中午状态
  70.     /// </summary>
  71.     public class NoonState : IState 
  72.     {
  73.         public void WriteProgram(Work work)
  74.         {
  75.             if (work.Hour < 13)
  76.             {
  77.                 Console.WriteLine("当前时间:{0}点 饿了,午饭;困了,午休。", work.Hour);
  78.             }
  79.             else
  80.             {
  81.                 work.CurrentState = new AfternoonState();
  82.                 work.WriteProgram();
  83.             }
  84.         }
  85.     }
  86.     /// <summary>
  87.     /// 下午工作状态
  88.     /// </summary>
  89.     public class AfternoonState : IState
  90.     {
  91.         public void WriteProgram(Work work)
  92.         {
  93.             if (work.Hour < 17)
  94.             {
  95.                 Console.WriteLine("当前时间:{0}点 下午状态还不错,继续努力!", work.Hour);
  96.             }
  97.             else
  98.             {
  99.                 //工作完成,下班回家
  100.                 if (work.TaskFinished)
  101.                 {
  102.                     work.CurrentState = new RestState();
  103.                     work.WriteProgram();
  104.                 }
  105.                 else//加班
  106.                 {
  107.                     work.CurrentState = new EveningState();
  108.                     work.WriteProgram();
  109.                 }
  110.             }
  111.         }
  112.     }
  113.     /// <summary>
  114.     /// 晚间工作状态
  115.     /// </summary>
  116.     public class EveningState : IState
  117.     {
  118.         public void WriteProgram(Work work)
  119.         {
  120.             if (work.TaskFinished)
  121.             {
  122.                 work.CurrentState = new RestState();
  123.                 work.WriteProgram();
  124.             }
  125.             else
  126.             {
  127.                 if (work.Hour < 21)
  128.                 {
  129.                     Console.WriteLine("当前时间:{0}点 加班哦,疲惫之急!", work.Hour);
  130.                 }
  131.                 else
  132.                 {
  133.                     work.CurrentState = new SleepingState();
  134.                     work.WriteProgram();
  135.                 }
  136.             }
  137.         }
  138.     }
  139.     /// <summary>
  140.     /// 下班了
  141.     /// </summary>
  142.     public class RestState : IState
  143.     {
  144.         public void WriteProgram(Work work)
  145.         {
  146.             Console.WriteLine("当前时间:{0}点 工作完成了,下班,回家!",work.Hour);
  147.         }
  148.     }
  149.     /// <summary>
  150.     /// 睡眠时间
  151.     /// </summary>
  152.     public class SleepingState : IState
  153.     {
  154.         public void WriteProgram(Work work)
  155.         {
  156.             Console.WriteLine("当前时间:{0}点 不行了,困死了,要睡觉!",work.Hour);
  157.         }
  158.     }
  159.     public class Work
  160.     {
  161.         /// <summary>
  162.         /// 工作状态 
  163.         /// </summary>
  164.         public IState CurrentState { getset; }
  165.         /// <summary>
  166.         /// 当前时间
  167.         /// </summary>
  168.         public double Hour { getset; }
  169.         /// <summary>
  170.         /// 工作是是否完成
  171.         /// </summary>
  172.         public bool TaskFinished { getset; }
  173.         public Work()
  174.         {
  175.             //默认为上午工作状态
  176.             this.CurrentState = new ForenoonState();
  177.         }
  178.         public void WriteProgram()
  179.         {
  180.             this.CurrentState.WriteProgram(this);
  181.         }
  182.     }
  183.     //测试
  184.     class ClientTest
  185.     {
  186.         static void Main(string[] args)
  187.         {
  188.             Work worker = new Work();
  189.             worker.Hour = 9;
  190.             worker.WriteProgram();
  191.             worker.Hour = 11;
  192.             worker.WriteProgram();
  193.             worker.Hour = 12.50;
  194.             worker.WriteProgram();
  195.             worker.Hour = 14;
  196.             worker.WriteProgram();
  197.             worker.Hour = 16;
  198.             worker.TaskFinished = true;
  199.             worker.WriteProgram();
  200.             worker.Hour = 18;
  201.             worker.WriteProgram();
  202.             worker.Hour = 20;
  203.             worker.WriteProgram();
  204.             worker.Hour = 22;
  205.             worker.WriteProgram();
  206.             Console.WriteLine();
  207.         }
  208.     }
  209.     #endregion
  210. }