本文通过例题为大家讲解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类中我们需要加入判断,如果当前时间满足早上的时间段,显示工作状态,如果当前时间不再是早上的时间段,那么我们进入下一个时间段,以此类推,找到我们当前时间段的工作状态。
实现:
类项目 { 静态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 nullc#学习笔记之状态模式详解