状态模式(State) Java 调用者不需要关心自身状态
2016-06-18 17:28
603 查看
定义
状态模式(state):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。类图
代码:
State和实现类
package ding.study.designpatterns.state; /** * 抽象状态类 * @author daniel * @version 正式版 */ public abstract class State { /** * 显示当前状态 * @param w */ public abstract void writeProgram(Work w); } package ding.study.designpatterns.state; /** * 下午的状态类 * * @author daniel * @version 正式版 */ public class AfternoonState extends State { @Override public void writeProgram(Work w) { if (w.getHour() < 17) { System.out.println("当前时间" + w.getHour() + "点,下午状态还不错,继续努力。"); } else { w.setCurrent(new EveningState()); w.writeProgram(); } } } package ding.study.designpatterns.state; /** * 傍晚的状态 * @author daniel * @version 正式版 */ public class EveningState extends State { @Override public void writeProgram(Work w) { // 判断工作是否完成 if(w.isFinish()){ w.setCurrent(new RestState()); w.writeProgram(); }else{ if(w.getHour()<21){ System.out.println("当前时间"+w.getHour()+"点,加班哦 疲惫至极。"); }else{ w.setCurrent(new SleepingState()); w.writeProgram(); } } } }
Work
package ding.study.designpatterns.state; /** * 工作状态类 * @author daniel * @version 正式版 */ public class Work { private State current;//状态 private double hour;//时间 private boolean finish=false;//是否完成 /** * 初始化上午 */ public Work(){ current=new ForenoonState(); } /** * 输出当前员工状态 */ public void writeProgram(){ current.writeProgram( this); } /** * daniel_自动生成的get方法 * * @return the current */ public State getCurrent() { return current; } /** * daniel_自动生成的set方法 * * @param current the current to set */ public void setCurrent(State current) { this.current = current; } /** * daniel_自动生成的get方法 * * @return the hour */ public double getHour() { return hour; } /** * daniel_自动生成的set方法 * * @param hour the hour to set */ public void setHour(double hour) { this.hour = hour; } /** * daniel_自动生成的get方法 * * @return the finish */ public boolean isFinish() { return finish; } /** * daniel_自动生成的set方法 * * @param finish the finish to set */ public void setFinish(boolean finish) { this.finish = finish; } }
测试类
package ding.study.designpatterns.state; import com.ding.webservice.Wsdl; import java.util.HashMap; import java.util.Map; import org.springframework.context.support.GenericXmlApplicationContext; /** * 状态模式(state):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 * * * @author daniel * @email 576699909@qq.com * @time 2016-6-18 下午5:23:40 */ public class ZTestMain { /** * @param args */ public static void main(String[] args) { // new 人工作类 设置时间 输出状态 Work w = new Work(); w.setHour(9); w.writeProgram(); w.setHour(10); w.writeProgram(); w.setHour(11); w.writeProgram(); w.setHour(12); w.writeProgram(); w.setHour(13); w.writeProgram(); w.setHour(14); w.writeProgram(); w.setHour(15); w.writeProgram(); w.setHour(16); w.writeProgram(); w.setHour(17); w.writeProgram(); w.setHour(18); w.writeProgram(); w.setHour(19); w.writeProgram(); w.setHour(20); w.writeProgram(); w.setHour(21); w.writeProgram(); w.setHour(22); w.writeProgram(); w.setHour(23); w.writeProgram(); w.setHour(24); w.writeProgram(); GenericXmlApplicationContext context = new GenericXmlApplicationContext(); context.setValidating(false); context.load("classpath*:applicationContext-ding*.xml"); context.refresh(); // String paths[] = {"applicationContext.xml"}; // 这个xml文件是Spring配置beans的文件,顺带一提,路径 在整个应用的根目录 // ApplicationContext ctx = new ClassPathXmlApplicationContext(paths); // MyBean myBean = (MyBean)ctx.getBean("myBeanImpl"); // 获得实现类的名字需要增加注解 String[] names = context.getBeanNamesForType(Wsdl.class); Map<String, Object> beans = new HashMap<String, Object>(); for (String name : names) { System.out.println("name:" + name); // beans.put(name, context.getBean(name)); } } }
输出
当前时间9.0点,上午工作,精神不错 当前时间10.0点,上午工作,精神不错 当前时间11.0点,上午工作,精神不错 当前时间12.0点,饿了:犯困。 当前时间13.0点,下午状态还不错,继续努力。 当前时间14.0点,下午状态还不错,继续努力。 当前时间15.0点,下午状态还不错,继续努力。 当前时间16.0点,下午状态还不错,继续努力。 当前时间17.0点,加班哦 疲惫至极。 当前时间18.0点,加班哦 疲惫至极。 当前时间19.0点,加班哦 疲惫至极。 当前时间20.0点,加班哦 疲惫至极。 当前时间21.0,不行了疲惫至极。 当前时间22.0,不行了疲惫至极。 当前时间23.0,不行了疲惫至极。 当前时间24.0,不行了疲惫至极。
源码
https://github.com/dingsai88/StudyTest/tree/master/src/ding/study/designpatterns/state相关文章推荐
- hibernate、java、数据库对应类型
- Java远程调试
- Eclipse插件安装方式
- Java中print、printf、println的区别
- Servlet、Struts2、SpringMVC执行流程
- eclipse开发project上显示有问号的愿意与解决方法
- Java的HashMap和HashTable
- 4、eclipse开发web的教程
- Eclipse关联android-support-v7.jar查看源码
- 表示数值的字符串
- Java使用自动化部署工具Gradle中的任务设定教程
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示。
- JAVA:递归实现输出正整数和等于n的所有不增的正整数和式
- java—代理技术的学习与总结
- 访问者模式(Visitor)Java
- Spring Boot集成MyBatis与分页插件
- Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool
- java 完美读取字节流 实例
- Structs2认识和入门
- spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异