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










