状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
类图:
代码:
publicclass Context {
private State state;
public Context(State state){
this.state=state;
}
public State getState() {
returnstate;
}
publicvoid setState(State state) {
this.state = state;
}
publicvoid request(){
if(state!=null){
state.handle(this);
}
}
}
publicinterface State {
void handle(Context context);
}
publicclass ConcreteStateA implements State{
@Override
publicvoid handle(Context context) {
context.setState(new ConcreteStateB());
System.out.println("状态非常好!!");
}
}
publicclass ConcreteStateB implements State{
@Override
publicvoid handle(Context context) {
context.setState(new ConcreteStateC());
System.out.println("状态一般!!");
}
}
publicclass ConcreteStateC implements State{
@Override
publicvoid handle(Context context) {
context.setState(new ConcreteStateA());
System.out.println("状态差,补充体力!!!");
}
}
publicstaticvoid main(String[] args) {
Context context=new Context(new ConcreteStateA());
context.request();
context.request();
context.request();
context.request();
}
优点:把不同状态的代码分离,根据状态改变行为。
缺点:状态的顺序决定了,修改,增加和删除状态都比较困难。
当一个对象的行为取决于的状态,并且它必须在运行时根据状态改变它的行为就可以考虑用状态模式。优化一个功能需要多个实现方案。