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

  

本文通过例题为大家讲解c#学习笔记之状态模式,供大家参考,具体内容如下

  

<强>题目1:强通过代码描述每一天的不同时间段的工作效率

  

分析:   

首先确定,工作状态指正在工作,或者以及下班这些情况,而这些情况所受影响的因素包括:当前时间以及任务是否已经完成,所以在工作中需要两个属性:小时和finish。然后根据这两个属性直接判断当前的工作状态即可。

  

实现:         类项目   {   静态void Main (string [] args)   {//紧急项目   工作emergencyProject=new ();   emergencyProject。小时=9;   emergencyProject.WriteProgram ();   emergencyProject。小时=10;   emergencyProject.WriteProgram ();   emergencyProject。小时=12;   emergencyProject.WriteProgram ();   emergencyProject。小时=13;   emergencyProject.WriteProgram ();   emergencyProject。小时=14;   emergencyProject.WriteProgram ();   emergencyProject。小时=17;   emergencyProject。完成=false;   emergencyProject.WriteProgram ();   emergencyProject。小时=19;   emergencyProject.WriteProgram ();   emergencyProject。小时=22;   emergencyProject.WriteProgram ();      Console.Read ();   }   公共类的工作   {   私人int小时;   私人bool完成=false;      公共int小时   {   {回报小时;}   集{小时=价值;}   }   公共bool完成   {   {回报完成;}   集{完成=价值;}   }///& lt; summary>///根据时间来判断当前的工作状态如何//////方法过长///& lt;/summary>   公共空间WriteProgram ()   {   如果(小时& lt;12)   {   控制台。WriteLine(“当前时间:{0}点上午工作,精神百倍”,小时);   }   else if(小时& lt;13)   {   控制台。WriteLine(“当前时间:{0}点饿了,午饭;犯困,午休”,小时);   }   else if(小时& lt;17)   {   控制台。WriteLine(“当前时间:{0}点下午状态还不错,继续努力”,小时);   }   其他的   {   如果(完成)   {   控制台。WriteLine(“当前时间:{0}点下班回家了”,小时);   }   其他的   {   如果(小时& lt;21)   {   控制台。WriteLine(“当前时间:{0}点加班哦,疲惫至极”,小时);   }   其他的   {   控制台。WriteLine(“当前时间:{0}点不行了,睡着了。”,小时);   }   }   }   }   }   }   之前      

<强>题目2:从1中可以很明显的看出WriteProgram()函数几乎承载了所有的判断处理,且函数函数过长,所以在工作类中违背了“单一职责原则”。

  

分析:   

面向对象设计就是希望做到代码的责任分解,在这个情况中,我们将所有的判断全部添加在了WriteProgram()一个函数中,不仅是函数冗长,如果我临时添加新的情况,可能对原来判断有出入的时间也会造成很多麻烦,对于将来的修改百害而无一利。

  

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

  

本题目中,我们需要获得当前的工作状态,而这个的直接影响因素包括时间小时和是否已经完成任务TaskFinished。

  

所以我们根据当前的时间可以很明显的分为不同时间段,也就是WriteProgram()的,如果其他人都可以自己单独拥有一个类,他们都继承于同一个抽象类状态即可。

  

然后我们初始化直接进入ForenoonState类,毕竟每天早上的时间不会变,如果当前时间不再是早上,那么我们就需要进入下一个时间段进行判断,所以在ForenoonState类中我们需要加入判断,如果当前时间满足早上的时间段,显示工作状态,如果当前时间不再是早上的时间段,那么我们进入下一个时间段,以此类推,找到我们当前时间段的工作状态。

  

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

  

实现:         类项目   {   静态void Main (string [] args)   {//紧急项目   工作emergencyProject=new ();   emergencyProject。小时=9;   emergencyProject.WriteProgram ();   emergencyProject。小时=10;   emergencyProject.WriteProgram ();   emergencyProject。小时=12;   emergencyProject.WriteProgram ();   emergencyProject。小时=13;   emergencyProject.WriteProgram ();   emergencyProject。小时=14;   emergencyProject.WriteProgram ();   emergencyProject。小时=17;   emergencyProject。TaskFinished=false;   emergencyProject.WriteProgram ();   emergencyProject。小时=19;   emergencyProject.WriteProgram ();   emergencyProject。小时=22;   emergencyProject.WriteProgram ();      Console.Read ();   }   公共类的工作   {   私人int小时;   私人bool完成=false;   目前私人状态;//初始化进入的时候是上午工作状态   公共工程()   {   当前=new ForenoonState ();   }   公共int小时   {   {回报小时;}   集{小时=价值;}   }   公共bool TaskFinished   {   {回报完成;}   集{完成=价值;}   }      公共空间设置状态(状态)   {   当前=s;   }   公共空间WriteProgram ()   {   current.WriteProgram(这个);   }   }///& lt; summary>///抽象状态///& lt;/summary>   公共抽象类状态   {   公共抽象空洞WriteProgram (w)工作;   }///& lt; summary>///上午工作状态//////逻辑是:根据时间推移,上午工作后,移至中午午饭时间///& lt;/summary>   公共类ForenoonState:状态   {   公共覆盖空白WriteProgram (w)工作   {   如果(w。小时& lt;12)   {   控制台。WriteLine(“当前时间:{0}上午工作,精神百倍”,w.Hour);   }   其他的   {   w。设置状态(新NoonState ());   w.WriteProgram ();   }   }   }///& lt; summary>///中午工作状态//////逻辑是:根据时间推移,午休时间后,移至下午工作时间///& lt;/summary>   公共类NoonState:状态   {   公共覆盖空白WriteProgram (w)工作   {   如果(w。小时& lt;13)   {   控制台。WriteLine(“当前时间:{0}饿了,午饭;犯困,午休”,w.Hour);   }   其他的   {   w。设置状态(新AfternoonState ());   w.WriteProgram ();   }   }   }///& lt; summary>///下午工作状态//////逻辑是:根据时间推移,下午工作后,移至晚间工作状态///& lt;/summary>   公共类AfternoonState:状态   {   公共覆盖空白WriteProgram (w)工作   {   如果(w。小时& lt;17)   {   控制台。WriteLine(“当前时间:{0}下午状态还不错,继续努力”,w.Hour);   }   其他的   {   w。设置状态(新EveningState ());   w.WriteProgram ();   }   }   }///& lt; summary>///晚间工作状态//////逻辑是:已完成工作的可以准点下的班,移至下班休息状态///未完成工作的继续加班:这里又分为未超过人体承受能力的(21小时)就继续加班(此处已是最底层,没有再多加其他的操作了)///超过21个小时的将移至睡眠状态///& lt;/summary>   公共类EveningState:状态   {   公共覆盖空白WriteProgram (w)工作   {   如果(w.TaskFinished)   {   w。设置状态(新RestState ());   w.WriteProgram ();   }   其他的   {//最底层,不要再次调用,会无限往复的   如果(w。小时& lt;21)   {   控制台。WriteLine(“当前时间:{0}加班哦,疲惫至极”,w.Hour);   }   其他的   {   w。设置状态(新SleepingState ());   w.WriteProgram ();   }   }   }   }///& lt; summary>///睡眠状态//////最底层,不要再次调用,会无限往复的///& lt;/summary>   公共类SleepingState:状态   {   公共覆盖空白WriteProgram (w)工作   {   控制台。WriteLine(“当前时间:{0}点不行了,睡着了”,w.Hour);   }   }///& lt; summary>///下班休息状态//////最底层,不要再次调用,会无限往复的///& lt;/summary>   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

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