这次来看下状态模式,先来看下定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
再来看下类图:
来看下代码吧:
public interface State { void start(); void middle(); void stop();}
public class StartState implements State { private Context context; public StartState(Context context) { this.context = context; } @Override public void start() { System.out.println("开始状态"); context.setState(context.getMiddleState()); } @Override public void middle() { System.out.println("对不起,状态都没开始所以无法处于中间状态"); } @Override public void stop() { System.out.println("对不起,状态都没开始所以无法处于结束状态"); }}
public class MiddleState implements State { private Context context; public MiddleState(Context context) { this.context = context; } @Override public void start() { System.out.println("对不起,状态已经开始"); } @Override public void middle() { System.out.println("中间状态"); context.setState(context.getStopState()); } @Override public void stop() { System.out.println("对不起,状态已经处于中间状态无法结束"); }}
public class StopState implements State { private Context context; public StopState(Context context) { this.context = context; } @Override public void start() { System.out.println("对不起,状态已经处于结束状态"); } @Override public void middle() { System.out.println("对不起,状态已经处于结束状态"); } @Override public void stop() { System.out.println("结束状态"); context.setState(context.getStartState()); }}
public class Context { private State startState; private State middleState; private State stopState; private State state; public Context() { this.startState = new StartState(this); this.middleState = new MiddleState(this); this.stopState = new StopState(this); this.state = startState; } public State getStartState() { return startState; } public State getMiddleState() { return middleState; } public State getStopState() { return stopState; } public void setState(State state) { this.state = state; } public void start() { state.start(); } public void middle() { state.middle(); } public void stop() { state.stop(); }}
如果不想用很多的if的话,状态模式很适合,把所有状态机都封装成一个类,一个类就是一个状态,职责单一,也很好扩展,问题就是状态很多的话,类也会很多,其实前面的模式哪个类会少呢。
如果有不对请提出,共同提高,谢谢!!