状态模式:一个对象状态发生改变时会导致其行为也发生变化。
由图可见 状态模式中Context和IState是耦合的,不同的状态之间行为是隔离的。因为这个模式最初的目的是为了剔除Context中根据不同的State去进行状态行为选择的分支。从而将对于状态行为选择的职责剥离。
状态需要是一个闭环的结构.
/**
* @author yanjy
* @date 2017/12/2
*/
public class Context {
private String stateStr;
private IState state;
public Context(String stateStr, IState state) {
this.stateStr = stateStr;
this.state = state;
}
public void request() {
state.handle(this);
}
public IState getState() {
return state;
}
public void setState(IState state) {
this.state = state;
}
public String getStateStr() {
return stateStr;
}
public void setStateStr(String stateStr) {
this.stateStr = stateStr;
}
public static void main(String[] args) {
Context context = new Context("A", new ConcreteStateA());
context.request();
context.setStateStr("B");
context.request();
}
}
public interface IState {
void handle(Context context);
}
public class ConcreteStateA implements IState {
@Override
public void handle(Context context) {
if ("A".equals(context.getStateStr())) {
System.out.println("A");
} else {
context.setState(new ConcreteStateB());
context.getState().handle(context);
}
}
}
public class ConcreteStateB implements IState {
@Override
public void handle(Context context) {
if ("B".equals(context.getStateStr())) {
System.out.println("B");
} else {
context.setState(new ConcreteStateA());
context.getState().handle(context);
}
}
}
状态模式适用于一个对象在运行的过程中要根据所处的不同状态进行行为的更替,同时这种方式对新增状态是开放的,只需增加对应的类,且注意保证状态闭环就好,无需修改Context,符合开放封闭原则。