设计模式之状态模式
2016-04-09 21:14
260 查看
public class Work { private State current; private double hour; private boolean finish = false; public boolean isFinish() { return finish; } public void setFinish(boolean finish) { this.finish = finish; } public double getHour() { return hour; } public void setHour(double hour) { this.hour = hour; } public Work() { current = new ForenoonState(); } 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 extends State { public void WriteProgram(Work w) { // TODO Auto-generated method stub if(w.getHour() < 12) { System.out.println("当前时间" + w.getHour() + "点,上午工作,精神百倍"); } else { //大于12点,转入中午的状态 w.SetState(new NoonState()); w.WriteProgram(); } } } public class NoonState extends State { public void WriteProgram(Work w) { // TODO Auto-generated method stub if(w.getHour() < 13) { System.out.println("当前时间" + w.getHour() + "点,午休"); } else { //大于13点了,转入下午的工作状态 w.SetState(new AfternoonState()); w.WriteProgram(); } } } public class AfternoonState extends State { public void WriteProgram(Work w) { // TODO Auto-generated method stub if(w.getHour() < 17) { System.out.println("当前时间" + w.getHour() + "点,下午状态不错,继续努力"); } else { //大于17点了,转入晚上的加班状态 w.SetState(new EveningState()); w.WriteProgram(); } } } public class ResetState extends State { public void WriteProgram(Work w) { // TODO Auto-generated method stub System.out.println("当前时间:" + w.getHour() + "已完成工作可以下班回家了"); } } public class EveningState extends State { public void WriteProgram(Work w) { // TODO Auto-generated method stub if(w.isFinish()) { //任务完成,转入下班的状态 w.SetState(new ResetState()); w.WriteProgram(); } else { if(w.getHour() < 21) { System.out.println("当前时间" + w.getHour() + "点,加班状态,疲惫至极"); } else { //已经超过21点,转入睡眠状态了 w.SetState(new SleepingState()); w.WriteProgram(); } } } } public class SleepingState extends State { public void WriteProgram(Work w) { // TODO Auto-generated method stub System.out.println("当前时间:" + w.getHour() + "点,加班睡着了"); } } public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Work w = new Work(); w.setHour(9); w.WriteProgram(); w.setHour(10); w.WriteProgram(); w.setHour(12); w.WriteProgram(); w.setHour(13); w.WriteProgram(); w.setHour(14); w.WriteProgram(); w.setHour(17); w.WriteProgram(); w.setFinish(false); w.WriteProgram(); w.setHour(19); w.WriteProgram(); w.setHour(22); w.WriteProgram(); } }
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
好处:
将与特定状态相关的行为局部化,且将不同状态的行为分割开来,将特定状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换。
用处:
当一个对象的行为取决于他的状态,并且必须在运行时刻根据状态改变它的行为时应考虑使用状态模式。
相关文章推荐
- C#中常用容器的使用与底层数据结构
- HDU 2104 hide handkerchief
- request.getParameter() 和request.getAttribute() 区别
- SpringMVC 理论与有用技术(一) 简单、有用、易懂的几个实例
- PHP-007(转)
- Java Socket实现WebSocket服务器
- SSO系列之——同域下单点登录系统介绍
- java基础知识整理(2)
- 用全排列方法解决N皇后问题(Leetcode 51)
- Android 之EditText自动检索Listview中的数据
- 算法初探——归并排序
- 认识Shiro框架
- 关于eclipce添加离线adt 和sdk
- Hive学习路线图--张丹老师
- 使用clipboard.js复制页面内容到剪切板
- 图说js中的this——深入理解javascript中this指针
- hdu 4152 ZZY’s Dilemma【DFS】
- Java正则表达式学习笔记
- Android进阶学习内容整理
- 过桥问题