定 义:当一个对象内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,
把状态的判断逻辑转移到表示不同状态的一系列子类中,可以把复杂的逻辑简化。
结构图:
示例结构图:
状态类:
//抽象状态 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()); //超过12点转入中午工作状态 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()); //超过13点转入下午工作状态 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()); //超过17点转入傍晚工作状态 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()); //超过21点,则转入睡眠状态 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); } }