状态模式(设计模式_18)
2016-12-30 16:44
411 查看
状态模式,例如在一个对象中,用了if/switch这种语句判断,而产生的(方法过长)时,如果以后扩展增加功能的话,就需要去改,if/switch这种语句里面的代码,这样的话就违背了开放封闭式原则, 所以在这种情况下就可以考虑状态模式, 如果判断很简单那就没有必要用状态模式了
面向对象设计中希望做到责任分解
以下就举例(案例),从传统方式,演变成状态模式的过程:
传统方式完成:
运行结果:
![](https://img-blog.csdn.net/20161230163657388?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTk2NzAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
演变成状态模式:
运行结果:
![](https://img-blog.csdn.net/20161230164234301?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTk2NzAwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006
面向对象设计中希望做到责任分解
以下就举例(案例),从传统方式,演变成状态模式的过程:
传统方式完成:
package com.oop.demo2; /** * 定义工作对象 * @author Liudeli * */ public class Work { /** * 定义工作之外的属性 */ private int hour; private boolean isComplete; public int getHour() { return hour; } public void setHour(int hour) { this.hour = hour; } public boolean isComplete() { return isComplete; } public void setComplete(boolean isComplete) { this.isComplete = isComplete; } /** * 做安卓项目开发工作 */ public void doAndroidProject() { // 上午九点钟开始上班 if (hour < 12) { System.out.println(hour + "点钟,上午上班精力旺盛..."); } else if(hour < 13) { System.out.println(hour + "点钟,中午饿了,该吃饭了..."); } else if (hour <18) { System.out.println(hour + "点钟,下午犯困,效率降低了..."); } else { if (isComplete) { System.out.println(hour + "点钟,下班走人..."); } else { System.out.println(hour + "点钟,还在熬夜加班中..."); } } } }
package com.oop.demo2; /** * 测试程序(改进版本 分类) * @author Liudeli * */ public class Main { public static void main(String[] args) { Work work = new Work(); for (int i = 9; i < 24; i++) { try { Thread.sleep(1200); work.setHour(i); work.doAndroidProject(); if (20 == i) { work.setComplete(true); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
运行结果:
演变成状态模式:
package com.oop.demo4; /** * 抽象出状态抽象类 */ public abstract class State { /** * 做C项目的工作 * @param work */ public abstract void doCProject(Work work); }
package com.oop.demo4; /** * 定义上午状态具体对象 * @author Liudeli * */ public class ShanwuState extends State{ public void doCProject(Work work) { int hour = work.getHour(); if (hour < 12) { System.out.println(hour + "点钟,上午工作,精力旺盛..."); } else { // 切入到中午状态具体对象 work.setState(new ZhonwuState()); // 工作 work.doWork(); } } }
package com.oop.demo4; /** * 定义中午具体对象 * @author Liudeli * */ public class ZhonwuState extends State{ public void doCProject(Work work) { int hour = work.getHour(); if (hour < 13) { System.out.println(hour + "点钟,中午时间到了,该去吃饭了..."); } else { // 切换到下午状态具体对象 work.setState(new XiawuState()); // 工作 work.doWork(); } } }
package com.oop.demo4; /** * 定义下午具体对象 * @author Liudeli * */ public class XiawuState extends State{ public void doCProject(Work work) { int hour = work.getHour(); if (hour < 18) { System.out.println(hour + "点钟,下午犯困,工作效率降低..."); } else { // 决定是下班状态 work.setState(new ExitState()); work.doWork(); } } }
package com.oop.demo4; /** * 定义加班具体对象 * @author Liudeli * */ public class JiabanState extends State{ public void doCProject(Work work) { boolean exit = work.getExit(); if (exit) { work.setState(new ExitState()); work.doWork(); } else { System.out.println(work.getHour() + "点钟,在无休止的加班熬夜中..."); } } }
package com.oop.demo4; /** * 下班离开状态具体对象 * @author Liudeli * */ public class ExitState extends State { public void doCProject(Work work) { boolean exit = work.getExit(); System.out.println(exit); if (exit) { System.out.println(work.getHour() + "点钟,工作完成,已下班,准备下班中..."); } else { work.setState(new JiabanState()); work.doWork(); } } }
package com.oop.demo4; /** * 定义具体工作对象 * @author Liudeli * */ public class Work { /** * 定义抽象状态的抽象类 */ private State state; // 默认上午开始工作 public Work() { this.state = new ShanwuState(); } public void setState(State state) { this.state = state; } public State getState() { return state; } /** * 定义工作时间 */ public int hour; public void setHour(int hour) { this.hour = hour; } public int getHour() { return hour; } /** * 定义是否下班 */ private boolean isExit; public boolean getExit() { return isExit; } public void setExit(boolean isExit) { this.isExit = isExit; } /** * 执行工作 */ public void doWork() { state.doCProject(this); } }
/** * 测试程序(状态模式) * @author Liudeli * */ public class Test { public static void main(String[] args) { Work work = new Work(); for (int i = 9; i < 24; i++) { try { Thread.sleep(1200); work.setHour(i); if (19 < i) { work.setExit(true); } work.doWork(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
运行结果:
谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Debian 7.x 安装Oracle JAVA
- springmvc实现url路由功能
- spring boot 配置 druid/** * 配置druid * Created by adam on 4/11/16. */ @Configuration public class D
- api接口rsa加密