- 當一個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類別。
- 主要解決的是,當控制一個物件狀態轉換的條件運算式過於複雜時,把狀態判斷邏輯表示不同狀態的一系列類別當中,可以把複雜的判斷邏輯簡化。
using System;
namespace DPExample
{
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; }
}
private State current;
public void SetState(State s)
{
current = s;
}
public void WriteProgram()
{
current.Write (this);
}
public Work()
{
current = new ForenoonState();
}
}
abstract class State
{
public abstract void Write(Work w);
}
class ForenoonState : State
{
public override void Write (Work w)
{
if (w.Hour < 12)
Console.WriteLine ("當時時間:{0}點 上午工作,精神百倍", w.Hour);
else {
w.SetState (new NoonState ());
w.WriteProgram();
}
}
}
class NoonState : State
{
public override void Write (Work w)
{
if (w.Hour < 13)
Console.WriteLine ("當時時間:{0}點 餓了,午飯;覺的睏,午休", w.Hour);
else {
w.SetState (new AfternoonState());
w.WriteProgram();
}
}
}
class AfternoonState : State
{
public override void Write (Work w)
{
if (w.Hour < 17)
Console.WriteLine ("當時時間:{0}點 下午狀態還不錯,繼續努力", w.Hour);
else {
w.SetState (new EveningState());
w.WriteProgram();
}
}
}
class EveningState : State
{
public override void Write (Work w)
{
if (w.TaskFinished) {
w.SetState (new RestState ());
w.WriteProgram ();
} else {
if (w.Hour < 21)
Console.WriteLine ("當時時間:{0}點 加班哦,疲累至極", w.Hour);
else
{
w.SetState (new SleepingState());
w.WriteProgram();
}
}
}
}
class SleepingState : State
{
public override void Write(Work w)
{
Console.WriteLine ("當時時間:{0}點 不行了,睡著了", w.Hour);
}
}
class RestState : State
{
public override void Write(Work w)
{
Console.WriteLine ("當時時間:{0}點 下班回家了", w.Hour);
}
}
}


留言
張貼留言