1. 类图
2. 代码
- State相关
- 接口
-
public interface State { public void doAction(Context context); }
-
- 实现类:此处定义Start和Stop两个状态
-
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"; } }
-
- 接口
- Context相关
-
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); //Player is in start state System.out.println(context.getState().toString()); //Start State StopState stopState = new StopState(); stopState.doAction(context); //Player is in stop state System.out.println(context.getState().toString()); //Stop State } }
-
3. 总结
优点:
- 避免了if else的判断
- 很好的体现了开闭原则和单一职责原则,想要增加状态就增加子类,想要修改状态就修改子类即可
- 封装性非常好,状态变化放置到了类的内部来实现,外部调用不需要知道类内部如何实现状态和行为的变换
缺点:
- 状态多的时候,子类爆炸