设计模式之状态模式

状态(state)模式:状态模式的意图是,容许一个对象在其内部状改变时改变它的行为。看起来就像是改变了它的类同样。主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的状况。把状态的判断逻辑转移到表示不一样的一系列类当中,能够把复杂的逻辑判断简单化。java

角色:设计模式

一、抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
二、具体状态(ConcreteState)角色:每个具体状态类都实现了环境的一个状态所对的行为。

三、场景(Context)角色:定义客户端所感兴趣的接口,而且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象现有的状态。ide

总结:感受状态模式就是将原本在外部进行的状态转移,挪到了具体状态类内部进行。它经过具体状态类(Concrete State)持有场景的引用,改变场景(Context)的状态,从而不须要在外部控制状态的变化。学习

package com.perfecking.base;

public class StateModeDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		LightManager lightManager = new LightManager();
		lightManager.setState(new GreenLight());
		lightManager.shine();
	}

}
interface State{
	public void change(LightManager light);
}
class LightManager{
	State state = null;
	public void setState(State state){
		this.state = state;
	}
	public void shine(){
		while(true){
			state.change(this);
		}
	}
}
class GreenLight implements State{
	private static final int SLEEP_TIME = 2000;
	@Override
	public void change(LightManager light) {
		// TODO Auto-generated method stub
		System.out.println("Green Light Is Shining!请通行~~");
		try {
			Thread.sleep(SLEEP_TIME);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		light.setState(new YellowLight());
	}	
}

class RedLight implements State{
	private final static int SLEEP_TIME = 3000;
	@Override
	public void change(LightManager light) {
		// TODO Auto-generated method stub
		System.out.println("Red Light Is Shining!禁止通行~");
		try {
			Thread.sleep(SLEEP_TIME);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		light.setState(new GreenLight());
	}	
}
class YellowLight implements State{
	private final static int SLEEP_TIME = 1000;
	@Override
	public void change(LightManager light) {
		// TODO Auto-generated method stub
		System.out.println("Yellow Light Is Shining!禁止通行~");
		try {
			Thread.sleep(SLEEP_TIME);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		light.setState(new RedLight());
	}	
}

参考:java设计模式学习this

相关文章
相关标签/搜索