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

本文通过一个具体案例介绍了状态模式的应用,展示了如何根据不同时间段调整工作状态,实现了状态的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


定义

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dingsai88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值