狀態模式的好處
將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。將特定的狀態行為都放入一個對象中,由于所有與狀態相關的代碼都存在于某個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();
}