一、定义

允许一个对象在它的状态发往改变时改变其行为,这个对象看起来像是改变了它的类。

二、类图表示

状态模式

三、实现

1、State

package pattern.behavioral.state;

public abstract class State {

	public abstract void handle(Context context);
	
	@Override
	public String toString() {
		return this.getClass().getSimpleName();
	}
}


package pattern.behavioral.state;

public class ConcreteStateA extends State {

	@Override
	public void handle(Context context) {
		System.out.println("do something...");
		context.setState(new ConcreteStateB());
	}

}


package pattern.behavioral.state;

public class ConcreteStateB extends State{

	@Override
	public void handle(Context context) {
		System.out.println("take a break...");
		context.setState(new ConcreteStateA());
	}

}

2、Context

package pattern.behavioral.state;

public class Context {

	private State state;
	
	public Context(State state) {
		this.state = state;
	}

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}
	
	public void request(){
		state.handle(this);
	}
	
	public void show(){
		System.out.println(String.format("State: %s\n", state));
	}
}

四、使用

package pattern.behavioral.state;

public class Client {

	public static void main(String[] args) {
		Context context = new Context(new ConcreteStateA());
		context.show();
		
		context.request();
		context.show();
		
		context.request();
		context.show();
	}
}
  • 程序输出:
State: ConcreteStateA

do something...
State: ConcreteStateB

take a break...
State: ConcreteStateA

五、适用场合

  • 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为

  • 一个操作中含有庞大的多分支结构,并且这些分支依赖于对象的状态(State模式可以将每一个条件分支放入一个独立的类中,这使得你可以把对象的状态作为一个对象,这一状态对象可以不依赖其他状态对象而独立变化)