State
状态模式(State)主要是解决当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。(如果状态判断很简单,就没必要使用状态模式了。)
将特定的状态相关的行为都放入到一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所有通过定义新的子类可以很容易地增加新的状态和转换。(说白了就是消除庞大的条件分支语句。)
状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
当一个对象的行为取决于它的状态,并且它必须在运行时刻改变它的行为时,就可以考虑使用状态模式了。
//抽象状态 public abstract class State { public abstract void WriteProgram(Work w); } //上午和中午工作状态类 class ForenoonState : State { public override void WriteProgram(Work w) { if (w.hour < 12)//这个地方的判断,才是状态模式的要点。 { Console.WriteLine("当前时间:{0}点,上午工作,精神百倍。", w.hour); } else {//超过12点,则转入中午工作状态。这个地方,用一种非常高明的手段,让合适的方法来处理当前所处的状态。其实,如果世界项目中需要,也可以直接抛出异常。 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 RestState : State { public override void WriteProgram(Work w) { Console.WriteLine("当前时间:{0}点下班回家了",w.hour); } } //睡眠状态和下班休息状态 public class SleepingState : State { public override void WriteProgram(Work w) { Console.WriteLine("当前时间:{0}点不行了,睡着了。", w.hour); } } //工作类,此时没有了过长的分支判断语句。 public class Work { private State current; public Work() { current = new ForenoonState();//工作初始化为上午工作状态,即上午9点开始上班。 } public double hour { get; set; } public bool TaskFinished { get; set; }//任务完成属性,是否下班的依据。 public void SetState(State s) { current = s; } public void WriteProgram() { current.WriteProgram(this); } } static void Main(string[] args) { Work myWork = new Work(); myWork.hour = 9; myWork.WriteProgram(); myWork.hour = 10; myWork.WriteProgram(); myWork.hour = 11; myWork.WriteProgram(); myWork.hour = 12; myWork.WriteProgram(); myWork.hour = 14; myWork.WriteProgram(); myWork.hour = 17; myWork.WriteProgram(); Console.Read(); }