從狀態模式看“大神”和“菜鳥”的差別
《大話設計模式》中講狀態模式這一節名字叫做“無盡加班何時休-狀態模式”。菜鳥因為編程經驗不足,解決這個問題的能力不夠而不得不犧牲時間去不斷的寫代碼結果還是重復出錯。
而大神每次都能深入到問題的根源運用自己的思想去寫代碼。每一個問題都完美的解決。
加班的菜鳥一天各個時間段狀態都不一樣。從開始的精神百倍到越來越疲憊。
自己寫出的代碼不斷帶來問題。
代碼是程序猿思維智慧的結晶,菜鳥”程序猿沒有將自己的思維融入代碼寫出來的是這種:
class Program { 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.TaskFinished = false; emergencyProjects.WriteProgram(); emergencyProjects.Hour = 19; emergencyProjects.WriteProgram(); emergencyProjects.Hour = 22; emergencyProjects.WriteProgram(); Console.Read(); } } 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; } } public void WriteProgram() { if (Hour < 12) { Console.WriteLine("當前時間:{0}點 上午工作,精神百倍", Hour); } else if (Hour < 13) { Console.WriteLine("當前時間{0}點 餓了,午飯;犯困,午休。", Hour); } else if (Hour < 17) { Console.WriteLine("當前時間:{0}點 下午狀態不錯,繼續努力", Hour); } else { if (finish) { Console.WriteLine("當前時間{0}點 下班回家了", Hour); } else { if (Hour < 12) { Console.WriteLine("當前時間{0}點 加班哦。疲累", Hour); } else { Console.WriteLine("當前時間{0}點 不行了。睡著了。", Hour); } } } } }
這種代碼方法過長。裏面推斷分支太多假設要添加一些情況會修改非常多的代碼。給維護帶來非常大的風險。
運用狀態模式:
//工作類,如今沒有了過長的分支推斷語句 public class Work { private State current; public Work () { current = new ForenoonState();//初始化工作狀態為上午,即9點 } //"鐘點"屬性,狀態轉換根據 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); } } //抽象狀態 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 { w.SetState(new NoonState()); w.WriteProgram(); } } } // 中午工作狀態 public class NoonState : State { public override void WriteProgram(Work w) { if (w.Hour < 13) { Console.WriteLine("當前時間:{0}點 餓了,午飯;犯困,午休。", w.Hour); } else { w.SetState(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.SetState(new EveningState()); w.WriteProgram(); } } } //晚間工作狀態 public class EveningState : State { public override void WriteProgram(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(); } } } } //睡眠狀態 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); } }
client同上。運用狀態模式將特定狀態相關的行為局部化,而且將不同狀態的行為切割開來。把各種狀態轉移邏輯分布到子類之間來降低依賴。 這種程序是有靈活性的。
通往“大神”的路上……
從狀態模式看“大神”和“菜鳥”的差別