状态机的技术选型,yyds!( 三 )


▲状态模式实现的状态机
是什么
状态模式是编程领域特有的名词 , 是 23 种设计模式之一 , 属于行为模式的一种 。
它允许一个对象在其内部状态改变时改变它的行为 。对象看起来似乎修改了它的类 。
作用状态模式的设计意图主要是为了解决两个主要问题:

  1. 当一个对象的内部状态改变时 , 它应该改变它的行为 。
  2. 应独立定义特定于状态的行为 。也就是说 , 添加新状态不应影响现有状态的行为 。
类图:
状态机的技术选型,yyds!

文章插图
类图
定义一个State接口 , 它可以有N个实现类 , 每个实现类需重写接口State定义的handle方法 。它还有一个Context上下文类 , 内部持有一个State对象引用 , 外部状态发生改变(构造器内传入不同实现类) , 最终实现类自身行为动作也接着改变(实现类调用其自身的handle方法) 。
Context示意图参考
状态机的技术选型,yyds!

文章插图

状态机的技术选型,yyds!

文章插图
用状态模式实现的代码示例:
public interface SwitchState {    void handle();}public class TurnOffAction implements SwitchState{    @Override    public void handle() {        System.out.println("关灯");    }}public class TurnOnAction implements SwitchState{    @Override    public void handle() {        System.out.println("开灯");    }}public class Context {    private SwitchState state;    public Context(SwitchState state){        this.state=state;    }    public void doAction(){        state.handle();    }}复制代码输出
public class StatePatternDemo {    @DisplayName("状态模式测试用例-开灯")    @Test    public void turnOn() {        Context context = new Context(new TurnOnAction());        context.doAction();    }输出:开灯    @DisplayName("状态模式测试用例-关灯")    @Test    public void turnOff() {        Context context = new Context(new TurnOffAction());        context.doAction();    }}输出:关灯复制代码大家看下这段示例代码:Context类有一个有参构造方法 , 参数类型是State , 所以实例化对象的时候你可以传入State的不同的实现类 。最终context.doAction()调用的是不同实现类的doAction方法 。
▲开源实现
目前开源的状态机实现方案有spring-statemachine、squirrel-foundation、sateless4j等 。其中spring-statemachine、squirrel-foundation在github上star和fock数稳居前二 。
不过这些状态机普通使用下来普遍存在两个问题:
问题一:太复杂
因为基本囊括了UML State Machine上列举的所有功能 , 功能是强大了 , 但也搞得体积过于庞大、臃肿、很重 。很多功能实际生产场景中根本用不到 。

经验总结扩展阅读