设计模式12:状态模式

状态模式解决的是控制一个对象状态转移的表达式过于复杂的情况,把状态的判断逻辑转移表示到不同状态的一系列类中,可以把复杂的逻辑简化。

状态模式的好处是将特定状态的行为局部化,从而将不同状态的行为分割开来。

将特定状态的行为都放入一个对象中,由于与状态有关的代码都存在在具体的对象类中,因此定义新的子类可以很容易的实现增加新的状态和转换。

uml图:

State及其子类

public abstract class State {
	
	public abstract void writeProgram(Work work);
	
}

public class BeforeNoon extends State {

	@Override
	public void writeProgram(Work work) {
		if(work.getHour() < 12){
			System.out.println("现在是" + Integer.toString(work.getHour())+ "点,工作!");
		}
		else{
			work.setState(new Noon());
			work.writeProgram();
		}
	}

}

public class Noon extends State {

	@Override
	public void writeProgram(Work work) {
		if(work.getHour() < 14){
			System.out.println("现在是" + Integer.toString(work.getHour())+ "点,午休!");
		}
		else{
			work.setState(new AfterNoon());
			work.writeProgram();
		}
	}

}

public class AfterNoon extends State {

	@Override
	public void writeProgram(Work work) {
		if(work.getHour() < 17){
			System.out.println("现在是" + Integer.toString(work.getHour())+ "点,工作!");
		}
		else{
			work.setState(new Night());
			work.writeProgram();
		}
	}

}

public class Night extends State {

	@Override
	public void writeProgram(Work work) {
		if(work.isFinished()){
			System.out.println("现在是" + Integer.toString(work.getHour())+ "点,下班!");
		}
		else{
			System.out.println("现在是" + Integer.toString(work.getHour())+ "点,加班!");
		}
	}

}

Work

public class Work {

	private int hour = 0;
	private boolean isFinished = false;
	private State state = new BeforeNoon();
	
	public int getHour() {
		return hour;
	}
	public void setHour(int hour) {
		this.hour = hour;
	}
	public boolean isFinished() {
		return isFinished;
	}
	public void setFinished(boolean isFinished) {
		this.isFinished = isFinished;
	}
	
	public State getState() {
		return state;
	}
	public void setState(State state) {
		this.state = state;
	}
	public void writeProgram() {
		state.writeProgram(this);
	}
	
}

Demo

public class StateDemo {
	
	public static void main(String[] args) {
		Work work = new Work();
		for(int hour = 8; hour < 22; hour++){
			work.setHour(hour);
			if(hour == 19){
				work.setFinished(true);
			}
			work.writeProgram();
		}
	}
	
}

  

posted on 2017-04-13 11:24  一个后端狗  阅读(255)  评论(0编辑  收藏  举报

导航