状态模式(State) Java 调用者不需要关心自身状态

来源:互联网 发布:ip网络功放链接 编辑:程序博客网 时间:2024/05/22 08:14


定义

状态模式(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 {@Overridepublic 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





2 1
原创粉丝点击