大话设计模式--状态模式

    首先看一段代码:

  

public class Work {
	public static int hour = 0;
	public  static boolean workFinish = false;
	//写程序的方法
	public static void writeProgram(){
		if(hour <=12){
			System.out.println("当前时间"+hour+"开始上班");
		}else if(hour <=13){
			System.out.println("当前时间"+hour+"午休");
		}else if(hour <=17){
			System.out.println("当前时间"+hour+"下午开始上班");
		}else {
			if(workFinish){
				System.out.println("当前时间:"+hour+"");
			}else{
				if(hour < 21){
					System.out.println("当前时间:"+hour+"开始加班咯");
				}else{
					System.out.println("当前时间:"+hour+"不行咯,要睡觉咯");
				}
			}
		}
	}  

当有很多条件判断时,且很多的条件判断后产生了很多的业务逻辑,虽然代码可以正常执行,但是要修改某个逻辑,既整改逻辑流程也许就回发生改变,从而加大了维护时间的成本,并且冗长的业务逻辑代码使代码不够精简,可读性很差。

    所以引入状态模式,把每个逻辑流程封装成类,既这个流程的内在改变,从业务代码就转成了修改类。

    引入状态模式后的代码:

public abstract class WorkState {

	public abstract void WriteProgram(Works w);
}

将主要的业务功能封装成一个抽象,每个流程类去实现它就行:

package status;

public class AfternoonState extends WorkState {

	@Override
	public void WriteProgram(Works w) {
		// TODO Auto-generated method stub
		System.out.println(11);
		if(w.getHour() < 17){
			System.out.println("当前时间:"+w.getHour()+": 下午状态还不错,继续努力");
		}else{
			w.setState(new EveningState());
			w.writeProgram();
		}
	}

}
package status;

public class EveningState extends WorkState{

	@Override
	public void WriteProgram(Works w) {
		// TODO Auto-generated method stub
		System.out.println(11);
		if(w.tashFinished){
			w.setState(new RestState());
			w.writeProgram();
		}else{
			if(w.getHour() < 21){
				System.out.println("当前时间:"+w.getHour() +" 加班疲累之极");
			}else{
				w.setState(new SleepingState());
				w.writeProgram();
			}
		}
	}

}

package status;
//上午工作 状态
public class ForenoonState extends WorkState {

	@Override
	public void WriteProgram(Works w) {
		// TODO Auto-generated method stub
		System.out.println(11);
		if(w.getHour()< 12){
			System.out.println("上午工作精神百倍 "+w.getHour());
		}else{
			w.setState(new NoonState());
			w.writeProgram();
		}
	}


}

package status;

public class NoonState extends WorkState {

	@Override
	public void WriteProgram(Works w) {
		// TODO Auto-generated method stub
		System.out.println(11);
		if(w.getHour() < 13 ){
			System.out.println("当前时间:"+w.getHour()+" : 适合午饭、午休");
		}else{
			w.setState(new AfternoonState());
		}
	}
	
}

package status;

public class RestState extends WorkState {

	@Override
	public void WriteProgram(Works w) {
		// TODO Auto-generated method stub
		System.out.println(11);
		System.out.println("当前时间: "+w.getHour()+" 下班回家了");
	}

}
package status;

public class SleepingState extends WorkState {

	@Override
	public void WriteProgram(Works w) {
		// TODO Auto-generated method stub
		System.out.println(11);
		System.out.println("当前时间: "+w.getHour()+" 睡着了");
	}

}

工作运行方法:

package status;

public class Works {

	private WorkState current;
	public Works(){
		current = new ForenoonState();
	}
	private double hour ;
	public double getHour() {
		return hour;
	}
	public void setHour(double hour) {
		this.hour = hour;
	}
	private boolean finish  = false;
	public boolean tashFinished;
	public boolean isFinish() {
		return finish;
	}
	public void setFinish(boolean finish) {
		this.finish = finish;
	}
	public void setState(WorkState s){
		this.current = s;
	}
	public void writeProgram(){
		current.WriteProgram(this);
	}
}
Works project = new Works();
		project.setHour(9);
		project.writeProgram();
		project.setHour(10);
		project.writeProgram();
		project.setHour(12);
		project.writeProgram();
		project.setHour(13);
		project.writeProgram();
		project.setHour(14);
		project.writeProgram();
		project.setHour(17);
		project.writeProgram();
		project.tashFinished = false;
		project.writeProgram();
		project.setHour(19);
		project.writeProgram();
		project.setHour(22);
		project.writeProgram();

上午工作精神百倍 9.0
上午工作精神百倍 10.0
当前时间:12.0 : 适合午饭、午休
当前时间:14.0: 下午状态还不错,继续努力
当前时间:17.0 加班疲累之极
当前时间:17.0 加班疲累之极
当前时间:19.0 加班疲累之极
当前时间: 22.0 睡着了

 所以在开发中会遇到 当一个对象的行为取决于它的状态时,并且它运行时根据它的状态改变它的行为时,就可以使用状态模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值