状态模式--将条件拆分出去的漂亮方法

或许很多人都遇到过这样的一种状况:

写代码时,有好多不同的条件,以前最开始喜欢用if/else来进行,

但是当if/else语句达到三层时,就已经非常难维护的,是极不推荐的。

后来学到了switch,就开始用switch来完成功能,但switch不能分割,

也就导致了switch所在的那个类代码量很多很杂。

这种判断总的来说是一种状态的转移,不同的状态对应的不同的处理逻辑。

这就要使用到另一种设计模式:状态模式。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况,

把状态的判断逻辑转移到不同状态的一系列类当中,可以吧复杂的判断逻辑简化。

下面以一整天的上班状态为例子看看类图:



如上类图,一般的写法是在state类里面用判断把所有的都考虑一遍,但状态模式是将所有的状态都分解给不同的类,

从而进行下一步。

当一个对象的行为取决于他的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式了。

下面看主要类代码:

State类:

package com.blog.anla.State;
/**
 * 工作状态抽象类
 * @author U-ANLA
 *
 */
public abstract class State {
	public abstract void writeProgram(Work w);
}


Work类:

package com.blog.anla.State;

/**
 * 工作类,此时没有了过长的分支判断语句。
 * @author U-ANLA
 *
 */
public class Work {
	private State current;
	
	public Work(){
		current = new ForenoonState();
	}
	
	private double hour;
	private boolean finish = false;

	public State getCurrent() {
		return current;
	}
	public void setCurrent(State current) {
		this.current = current;
	}
	public double getHour() {
		return hour;
	}
	public void setHour(double hour) {
		this.hour = hour;
	}
	public boolean isFinish() {
		return finish;
	}
	public void setFinish(boolean finish) {
		this.finish = finish;
	}
	
	public void writeProgram(){
		current.writeProgram(this);
	}
	
}


ForenoonState类:

package com.blog.anla.State;
/**
 * 上午和中午抽象类
 * @author U-ANLA
 *
 */
public class ForenoonState extends State{

	@Override
	public void writeProgram(Work w) {
		if(w.getHour() < 12){
			System.out.println("当前时间: "+w.getHour()+"点,上午工作");
		}else{
			w.setCurrent(new NoonState());
			w.writeProgram();
		}
	}

}


NoonState类:

package com.blog.anla.State;
/**
 * 中午状态
 * @author U-ANLA
 *
 */
public class NoonState extends State{

	@Override
	public void writeProgram(Work w) {
		if(w.getHour() < 13){
			System.out.println("当前时间:"+w.getHour()+"午饭,午休");
		}else{
			w.setCurrent(new AfternoonState());
			w.writeProgram();
		}
	}
	
}


AfternoonState类:

package com.blog.anla.State;
/**
 * 下午状态
 * @author U-ANLA
 *
 */
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();
		}
	}
	
}


EveningState类:

package com.blog.anla.State;
/**
 * 晚上状态
 * @author U-ANLA
 *
 */
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();
			}
		}
	}
	
}


RestState类:

package com.blog.anla.State;
/**
 * 下班状态
 * @author U-ANLA
 *
 */
public class RestState extends State{
	@Override
	public void writeProgram(Work w) {
		System.out.println("当前时间"+w.getHour()+",下班回家!");
	}

}


SleepingState类:

package com.blog.anla.State;
/**
 * 睡觉状态
 * @author U-ANLA
 *
 */
public class SleepingState extends State{

	@Override
	public void writeProgram(Work w) {
		System.out.println("当前时间"+w.getHour()+"点,睡觉了!");
	}
	
}


简单的理解就是,把多条件分支都拆开,放到不同类中,每个类就一个条件。

赠人玫瑰手留余香(oo)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值