状态模式(State Pattern)也叫作状态机模式(State Machine Pattern),允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类,属于行为型设计模式。
类的行为由状态决定,不同状态对应不同行为。
场景
(1)行为随状态改变而改变的场景。
(2)一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。
public abstract class State {protected Context context;public void setContext(Context context) {this.context = context;}public abstract void handle();}public class ConcreteStateA extends State {@Overridepublic void handle() {this.context.setCurrentState(Context.concreteStateB);this.context.handle();}}public class ConcreteStateB extends State {@Overridepublic void handle() {}}public class ConcreteStateC extends State {@Overridepublic void handle() {}}public class Context {public static final ConcreteStateA concreteStateA = new ConcreteStateA();public static final ConcreteStateB concreteStateB = new ConcreteStateB();public static final ConcreteStateC concreteStateC = new ConcreteStateC();private State currentState = concreteStateA;public void setCurrentState(State state){this.currentState = state;this.currentState.context = this;}public State getCurrentState(){return currentState;}public void handle(){this.currentState.handle();}}
框架
状态机spring的statemachine
与责任链的区别
- 状态模式明确状态之间的转换关系,各个状态对象知道自己要进入的下一个状态对象
- 责任链之间责任的调用可以动态调整,链式组装由客户端负责
与策略模式的区别
- 策略模式是由客户端选择策略,多种策略彼此独立
- 状态模式客户端只可以指定初始状态,状态之间的转换流向是固定的
优点
- 消除if else与策略模式相同
- 状态显示化成状态类,更直观
- 状态类可扩展
缺点
- 类膨胀
- 增加状态类还是需要修改类转换的代码
