前言
很好理解。这个名字让人听起来都很安静。看看在设计模式里,状态模式是怎样的吧
状态模式
英文:State
what
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像时改变了其类。
主要解决的是当一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简单化。
如果这个状态很简单,就没必要用“状态模式”了。
情景
夏天到了,我们总是由早晨的激情澎湃转换成中午的困意满满。这便是状态发生了改变。若写成代码,也许大家都会想到if 。。else和switch语句,但是一天状态转变的太多了,switch语句也会很多,这就造成了方法过长的坏味道。所以状态模式就出来了~
好处与用处
好处:
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
就是说将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个concrete state中,所以通过定义新的子类可以很容易地增加新的状态和转换。
目的:
消除庞大的条件分支语句,通过把各种状态转移逻辑分布到state的子类之间,来减少相互间的依赖。
应用
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。
代码展示
注意:
有过长分支判断语句的工作类:×
public class Work
{
private int hour;
public int Hour
{
get { return hour; }
set { hour = value; }
}
private bool finish = false;
public bool TaskFinished
{
get { return finish; }
set { finish = value; }
}
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);
}
}
}
}
}
调整后的work类:
public class Work
{
private State current;
public Work()
{
current = new ForenoonState();
}
private double hour;
public double Hour
{
get { return hour; }
set { hour = value; }
}
private bool finish = false;
public bool TaskFinished
{
get{return finish ;}
set{finish = value ;}
}
public void SetState(State s)
{
current = s;
}
public void WriteProgram()
{
current.WriteProgram(this);
}
}
抽象状态类:
public abstract class State //抽象状态
{
public abstract void WriteProgram(Work w);
}
客户端代码:
class Program
{
static void Main(string[] args)
{
Work emergencyProjects = new Work();
emergencyProjects.Hour = 9;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 10;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 12;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 13;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 14;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 17;
emergencyProjects.WriteProgram();
emergencyProjects.TaskFinished = false;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 19;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 22;
emergencyProjects.WriteProgram();
Console.Read();
}
}
效果图:
后记
直接跟着状态模式敲,可能逻辑会出现错误,可以从小菜开始的时候就跟上他的步伐,一步一步将它改好~