设计模式12:状态模式

Posted 一个后端狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式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();
		}
	}
	
}

  

以上是关于设计模式12:状态模式的主要内容,如果未能解决你的问题,请参考以下文章

大话设计模式读书笔记--12.状态模式

12状态模式

2018/12/07《大话设计模式》状态模式

多选模式列表视图行在删除后保持选中状态

用于从 cloudkit 检索单列的代码模式/片段

何时使用活动转换与动态片段的模式