技术_状态机应用

状态机是一种对有限状态事务的一组抽象.借助于自己工作上一个模块的重构,对其原理与应用做一个简单介绍

基本概念

  • 状态(State)

这个好理解,理解时需要带上"有限"一起. 状态机能表达的事务是有限的状态集可以描述的

  • 事件(Event)

触发一个状态到另一个状态转变的触发点

  • 动作(Action)

事件发生以后要执行动作。例如事件是“按开门按钮”,动作是“开门”。编程的时候,一个 Action 一般就对应一个函数

  • 转换(Transition)

从一个状态到另一个状态的过程,可以说是前面三种概念的整合

squirrel 状态机框架

  • 支持特征
  1. 流式定义状态及其流程
  2. 约定大于配置
  3. 通用表达式作用于之前定义的状态流程. 类似于aop的效果.(这点特别有用,对于后续需要另外扩展的逻辑特别方便)
  • Transition Types
  1. Internal Transition: 内部过程,不会触发进入或退出到新状态,不会引起状态改变
    builder.internalTransition().within(MyState.A).on(MyEvent.innerA);
  2. Local Transition: 本地过程, 不会进入或退出复合状态(composition state), 但会re-enter 复合状态中的内部状态
    builder.localTransition().from(MyState.A).to(MyState.CinA).on(MyEvent.intoC)
  3. External Transition: 外部过程,会进入新的状态,引起状态变更.
    builder.externalTransition().from(MyState.A).to(MyState.B).on(MyEvent.A2B);

实践案例

报价的流程用状态机重构实现, 可以有效的避免很多的模板类扩展回调的问题.
  • 报价流程
  1. 录入投资指令(确认一个总额度)
  2. 审批投资指令

    1. 审批通过 -> 执行第 三 步
    2. 审核不通过 -> 注销一级审批单(其他模块逻辑)
  3. 发送报价

    1. 执行发送之前的逻辑, 如扣除额度
    2. 创建二级审批单

      1. 审核通过, 发送报价
      2. 不通过, 撤销二级审批单
    3. 发送成功 -> 回填信息
    4. 发送失败 -> 注销二级审批单
  • 代码示例
  https://github.com/normalHeFei/normal_try/tree/master/java/src/main/java/wk/statemachine 

你可能感兴趣的:(状态,java)