- 當一個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類別。
- 主要解決的是,當控制一個物件狀態轉換的條件運算式過於複雜時,把狀態判斷邏輯表示不同狀態的一系列類別當中,可以把複雜的判斷邏輯簡化。
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); } } }
留言
張貼留言