您的位置:首页 > 编程语言 > Java开发

状态模式(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: