状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
State类,封装context特定状态相关行为
public interface State {
public void Handle(Context context);
}
Context类,维护一个实现State类的实例,并定义当前状态
public class Context {
private State state;
public Context(State state) {
super();
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void request() { request方法执行当前状态的行为
state.Handle(this);
}
}
ConcreteState类,具体状态,每个子类实现一个与Context的一个状态相关的行为
public class ConcreteStateA implements State {
@Override
public void Handle(Context context) {
// TODO Auto-generated method stub
...当前状态的具体行为...
context.setState(new ConcreteStateB());跳转到下一状态
}
}
public class ConcreteStateB implements State {
@Override
public void Handle(Context context) {
// TODO Auto-generated method stub
...当前状态的具体行为...
context.setState(new ConcreteStateA());跳转到下一状态
}
}
客户端代码
public static void main(String[] args) {
设置context初始状态为 ConcreteStateA
Context context = new Context(new ConcreteStateA());
不断的请求,同时更改了状态
context.request();
context.request();
context.request();
context.request();
}
}
状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。由于所有与状态相关的代码都存在某一个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换。
当一个对象的行为取决于它的状态,并且在运行时刻必须根据它的状态改变它的行为时,就可以考虑用状态模式。