无尽加班何时休 状态模式
16.1 加班 又是加班!
16.2 工作状态 函数版
namespace 状态模式 { class Program { static int Hour = 0; static bool WorkFinished = false; static void Main(string[] args) { Hour = 09; WriteProgram(); Hour = 10; WriteProgram(); Hour = 12; WriteProgram(); Hour = 13; WriteProgram(); Hour = 14; WriteProgram(); Hour = 17; WorkFinished = true; //WorkFinished = false; WriteProgram(); Hour = 19; WriteProgram(); Hour = 22; WriteProgram(); Console.Read(); } public static 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 (WorkFinished) { Console.WriteLine("当前时间:{0}点 下班回家了", Hour); } else { if (Hour < 21) { Console.WriteLine("当前时间:{0}点 加班哦,疲累之极", Hour); } else { Console.WriteLine("当前时间:{0}点 不行了,睡着了", Hour); } } } } } }
16.3 工作状态 分类版
namespace 状态模式 { class Program { static void Main(string[] args) { //工作中, Work emergencyProjects = new Work(); emergencyProjects.Hour = 09; 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.WorkFinished = true; emergencyProjects.TaskFinished = false; emergencyProjects.WriteProgram(); emergencyProjects.Hour = 19; emergencyProjects.WriteProgram(); emergencyProjects.Hour = 22; emergencyProjects.WriteProgram(); Console.Read(); } } //工作类, public 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 < 21) { Console.WriteLine("当前时间:{0}点 加班哦,疲累之极", hour); } else { Console.WriteLine("当前时间:{0}点 不行了,睡着了", hour); } } } } } }
16.4 方法过长是坏味道
面向对象设计其实就是希望做到代码的责任分解,Work类违背了单一职责原则,WriteProgram方法里面有那么多判断,若需要改动时会违背开放封闭原则,
16.5 状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类,
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简单化,如果这个状态判断很简单,就没必要用状态模式了,
namespace 状态模式 { class Program { static void Main(string[] args) { Context c = new Context(new ConcreteStateA()); c.Request(); c.Request(); c.Request(); c.Request(); Console.Read(); } } //抽象状态类, abstract class State { public abstract void Handle(Context context); } //具体状态类, class ConcreteStateA : State { public override void Handle(Context context) { context.State = new ConcreteStateB(); } } //具体状态类, class ConcreteStateB : State { public override void Handle(Context context) { context.State = new ConcreteStateA(); } } class Context { private State state; public Context(State state) { this.state = state; } public State State { get { return state; } set { state = value; Console.WriteLine("当前状态:" + state.GetType().Name); } } public void Request() { state.Handle(this); } } }
16.6 状态模式好处与坏处
状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,
目的是为了消除庞大的条件分支语句,
状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖,
什么时候考虑使用状态模式呢?当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式,
16.7 工作状态 状态模式版
namespace 状态模式 { 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.WorkFinished = true; emergencyProjects.TaskFinished = false; emergencyProjects.WriteProgram(); emergencyProjects.Hour = 19; emergencyProjects.WriteProgram(); emergencyProjects.Hour = 22; emergencyProjects.WriteProgram(); Console.Read(); } } //抽象状态, 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); } } //工作, public class Work { private State current; public Work() { current = new ForenoonState(); } 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); } } }