状态模式:
当一个对象的内在状态改变时,允许改变其行为,这个对象看起来是改变了其类。
当一个对象的状态发生改变的时候,它所对应的行为也随之改变,但是该行为的改变是靠类的改变完成的。
简单点说,这个对象的每个行为都是一个类,当该对象的状态发生改变的时候,该对象的行为也随之改变,也就是该对象所调用的随之改变。
现实联想:
状态模型就像是一个室温恒温系统。这个形容有点简单,但是也可以解释状态模式。我想去过网吧或者一些其他地方的人应该都知道室温恒温系统的作用,就是为了保持室温的恒温的。这个室温恒温系统只有个状态两:升温,降温。升温和降温之间的行为可以转换。当温度过高的时候,就会降温,系统的行为也会随之改变,系统就是调用降温这个具体的行为(可以说是一个行为的子类)。当温度过低的时候,就会升温,系统的行为就会变成升温(系统行为的另一个子类)。这两个行为之间可以互相转化。
状态模式的用途:
状态模式主要解决的是,当一对象状态转换的表达式过于复杂的时候,吧状态的判断逻辑,转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简单化。
状态模式的优点:
将特定相关的行为都放入一个对象中,由于所有状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换。
状态模式实例
所有的状态
//状态父类
public abstract class state
{
public abstract void WriteProgram(Work w);
}
//状态子类
public class ForenoonState : state
{
public override void WriteProgram(Work w)
{
if (w.Hour < 12)
{
Console.WriteLine("当前时间点:{0}点,上午工作,精神百倍",w.Hour );
}
else
{
//调用work类中的SetStat方法,更改为新的行为
w.SetStat(new NoonState());
//调用新行为的WriteProgram方法,完成事务的新行为的功能。
w.WriteProgram();
}
}
}
public class NoonState : state
{
public override void WriteProgram(Work w)
{
if (w.Hour <13)
{
Console.WriteLine("当前时间:{0}点饿了,午饭犯困午休。", w.Hour);
}
else
{
w.SetStat(new AfternoonState());
w.WriteProgram();
}
}
}
public class AfternoonState:state
{
public override void WriteProgram(Work w)
{
if (w.Hour < 17)
{
Console.WriteLine("当前时间:{0}点 下午状态还不错,继续努力。", w.Hour);
}
else
{
w.SetStat(new EveningState ());
w.WriteProgram();
}
}
}
public class EveningState :state
{
public override void WriteProgram(Work w)
{
//判断工作是否完成
if (w.TaskFinished )
{
//调用work类中的SetStat方法,更改为RestState行为
w.SetStat(new RestState());
w.WriteProgram();
}
else
{
if (w.Hour < 21)
{
Console.WriteLine("当前时间:{0}点 加班哦,疲累之极。", w.Hour);
}
else
{
w.SetStat(new SleepingState());
w.WriteProgram();
}
}
}
}
public class SleepingState : state
{
public override void WriteProgram(Work w)
{
Console.WriteLine("当前时间:{0}点 不行了,睡着了。", w.Hour);
}
}
public class RestState : state
{
public override void WriteProgram(Work w)
{
Console.WriteLine("当前时间:{0}点 下班回家了。", w.Hour);
}
}
行为转换——work类
public class Work
{
//现在工作状态
private state Current;
public Work()
{
Current = new ForenoonState();
}
//现在的时间
private double hour;
public double Hour
{
set { hour = value; }
get { return hour; }
}
//工作是否完成
private bool finish = false;
public bool TaskFinished
{
get { return finish; }
set { finish = value; }
}
//设置状态
public void SetStat(state s)
{
Current = s;
}
//实现行为的WriteProgram方法,也就是该行为的功能
public void WriteProgram()
{
Current.WriteProgram(this);
}
}
客户端代码
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.Hour = 19;
emergencyProjects.WriteProgram();
emergencyProjects.Hour = 22;
emergencyProjects.WriteProgram();
Console.Read();
}