状态模式
一、定义
允许一个对象在它的状态发往改变时改变其行为,这个对象看起来像是改变了它的类。
二、类图表示
三、实现
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模式可以将每一个条件分支放入一个独立的类中,这使得你可以把对象的状态作为一个对象,这一状态对象可以不依赖其他状态对象而独立变化)