13. 状态模式
状态模式与策略模式相似,为了避免使用if else 或 switch 语句,状态模式把状态封装了起来。
看一下这个例子。
摘录自菜鸟教程
public interface State {
public void doAction(Context context);
}
public class StartState implements State {
public void doAction(Context context) {
System.out.println("Player is in start state");
context.setState(this);
}
public String toString(){
return "Start State";
}
}
public class StopState implements State {
public void doAction(Context context) {
System.out.println("Player is in stop state");
context.setState(this);
}
public String toString(){
return "Stop State";
}
}
public class Context {
private State state;
public Context(){
state = null;
}
public void setState(State state){
this.state = state;
}
public State getState(){
return state;
}
}
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context();
StartState startState = new StartState();
startState.doAction(context);
System.out.println(context.getState().toString());
StopState stopState = new StopState();
stopState.doAction(context);
System.out.println(context.getState().toString());
}
}
以上代码就做了一件事,如果要修改context状态,只需要使用封装好的state对象的doAction(context)方法,执行任务并修改contex状态。
如果不使用状态模式,那么就要用else if 或者switch语句进行状态切换。如果要添加或者移除某个状态,那么就要修改代码,违反了OCP原则。
这就是状态模式想解决的问题。