《大话设计模式》--无尽加班何时休--状态模式<State>(16)
2015-06-11 09:07
218 查看
面向对象设计其实就是希望做到代码的责任分解。
S:当一个对象的内在状态改变时允许改变其行为, 这个对象看起来像是改变了其类。
它主要解决的是当控制一个对象状态转换的条件表达过于复杂时情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
好处:将与特定状态相关的行为局限化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。目的是为了消除宠大的条件分支语句。状态模式把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
When use?
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
![](http://img.blog.csdn.net/20150618113432755)
客户端代码:
S:当一个对象的内在状态改变时允许改变其行为, 这个对象看起来像是改变了其类。
它主要解决的是当控制一个对象状态转换的条件表达过于复杂时情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
好处:将与特定状态相关的行为局限化,并且将不同状态的行为分割开来。将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。目的是为了消除宠大的条件分支语句。状态模式把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
When use?
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
public class Work { private State current; private double hour; private bool finished = false; public Work() { current = new ForenoonState(); } public double Hour { get { return hour; } set { hour = value; } } public bool TaskFinished { get { return finished; } set { finished = value; } } public void SetState(State s) { current = s; } public void WriteProgram() { current.WriteProgram(this); } }
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(string.Format("当前时间:{0}点上午工作,精神百倍", w.Hour)); } else { w.SetState(new NoonState()); w.WriteProgram(); } } }
class NoonState:State { public override void WriteProgram(Work w) { if (w.Hour < 13) { Console.WriteLine(string.Format("当前时间:{0}点饿了,午钣;犯困,午休。", w.Hour)); } else { w.SetState(new AfternoonState()); w.WriteProgram(); } } }
class AfternoonState:State { public override void WriteProgram(Work w) { if (w.Hour < 17) { Console.WriteLine(string.Format("当前时间:{0}点下午状态还不错,继续努力。", w.Hour)); } else { w.SetState(new EveningState()); w.WriteProgram(); } } }
class RestState : State { public override void WriteProgram(Work w) { Console.WriteLine(string.Format("当前时间:{0}点下班回家了", w.Hour)); } }
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(string.Format("当前时间:{0}点加班哦,疲累之极", w.Hour)); } else { w.SetState(new SleepingState()); w.WriteProgram(); } } } }
class SleepingState : State { public override void WriteProgram(Work w) { Console.WriteLine(string.Format("当前时间:{0}点不行了,睡着了。", w.Hour)); } }
客户端代码:
Work w = new Work(); w.Hour = 11; w.WriteProgram(); w.Hour = 15; w.WriteProgram(); w.Hour = 23; w.WriteProgram();
相关文章推荐
- Leetcode[35]-Search Insert Position
- MvcPager 免费开源分页控件3.0版发布!
- Integer.toHexString(int)得到byte类型的十六进制字符串形式
- MVP模式与MVC模式
- 假期训练专题及模板——排序
- 美国政府网站将强制实现全站HTTPS加密,值得我国政府借鉴
- 《爱编程,爱c++十四期-第四章-c++对象》
- Qt学习笔记--编程技巧总结
- silicon_status用这个标志来控制灯的状态
- 精美jQuery插件及源码 前端开发福利
- Announce of Looksery Cup 2015-B. Looksery Party
- oracle 条件:1=1或1=0,动态添加条件
- 那些在学习iOS开发前就应该知道的事(part 2)
- 跳出手掌心--如何立即触发UIButton边界事件
- MyEclipse+Struts+Spring+Hibernate 环境配置
- OC-字符串函数
- 数据库复习1——数据库体系结构和关系系统
- 。Java注意事项
- ubuntu如何完全卸载和安装 Java及android环境
- Android:Layout_weight的深刻理解