状态模式(State Pattern)也叫作状态机模式(State Machine Pattern),允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类,属于行为型设计模式。

    类的行为由状态决定,不同状态对应不同行为。

    场景
    (1)行为随状态改变而改变的场景。
    (2)一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。
    image.png

    1. public abstract class State {
    2. protected Context context;
    3. public void setContext(Context context) {
    4. this.context = context;
    5. }
    6. public abstract void handle();
    7. }
    8. public class ConcreteStateA extends State {
    9. @Override
    10. public void handle() {
    11. this.context.setCurrentState(Context.concreteStateB);
    12. this.context.handle();
    13. }
    14. }
    15. public class ConcreteStateB extends State {
    16. @Override
    17. public void handle() {
    18. }
    19. }
    20. public class ConcreteStateC extends State {
    21. @Override
    22. public void handle() {
    23. }
    24. }
    25. public class Context {
    26. public static final ConcreteStateA concreteStateA = new ConcreteStateA();
    27. public static final ConcreteStateB concreteStateB = new ConcreteStateB();
    28. public static final ConcreteStateC concreteStateC = new ConcreteStateC();
    29. private State currentState = concreteStateA;
    30. public void setCurrentState(State state){
    31. this.currentState = state;
    32. this.currentState.context = this;
    33. }
    34. public State getCurrentState(){
    35. return currentState;
    36. }
    37. public void handle(){
    38. this.currentState.handle();
    39. }
    40. }

    框架
    状态机spring的statemachine

    与责任链的区别

    • 状态模式明确状态之间的转换关系,各个状态对象知道自己要进入的下一个状态对象
    • 责任链之间责任的调用可以动态调整,链式组装由客户端负责

    与策略模式的区别

    • 策略模式是由客户端选择策略,多种策略彼此独立
    • 状态模式客户端只可以指定初始状态,状态之间的转换流向是固定的

    优点

    • 消除if else与策略模式相同
    • 状态显示化成状态类,更直观
    • 状态类可扩展

    缺点

    • 类膨胀
    • 增加状态类还是需要修改类转换的代码