一、概述
- 状态模式,当一个对象的内在状态改变的时候允许改变其行为,这个对象看起来像是改变了其类。
- 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时候的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简单化。
- 状态模式的好处
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。将特定的状态行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreateState中,所以通过定义新的子类可以很容易的增加新的状态和转换。这样做的母的是为了消除庞大的条件分支语句。
状态模式通过把各种状态转移逻辑分布到 State 的子类之间,来减少相互间的依赖。
二、举例
//工作状态基类
class State
{
public abstract void WriteProgram(Work w);
}
//上午工作状态类
public class ForennoonState :State
{
public overridevoid WriteProgram (Work w)
{
if (w.Hour < 12)
{
Console.WriteProgram("当前时间:{0} 上午工作",w.Hour);
}
else
{
w.SetState(new NoonState());
w.WriteProgram();
}
}
}
//下午工作状态类
public class AfternoonState:State
{
public override void WriteProgram (Work w)
{
if (w.TaskFinished)
{
w.SetState(new RestState());
w.WriteProgram();
}
else
{
if (w.Hour < 21)
{
Console.WriteProgram("当前时间:{0} 午休",w.Hour);
}else
{
w.SetState(new SleepingState());
w.WriteProgram();
}
}
}
}
//工作类
public class Work
{
private State state;
public Work()
{
current = new ForennoonState();
}
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);
}
}
//客户端调用
static void Main(string[] args)
{
Work m = new Work();
m.Hour = 9;
m.WriteProgram();
m.Hour = 10;
m.WriteProgram();
m.Hour = 12;
m.WriteProgram();
m.Hour = 15;
m.WriteProgram();
m.Hour = 17;
m.WriteProgram();
m.TaskFinished = false;
Console.Read();
}