squirrel-foundation(松鼠状态机)简单介绍

本篇简单介绍下squirrel-foundation(松鼠状态机)了解的可以跳过。

if/else和switch对比

条件方式判断方式相对效率应用范围可读性
if/else逐级条件判断条件自由组合、万金油
switch跳跃式单一值匹配

其实本篇主题是记录下状态机(squirrel-foundation)的基本用法,难免不了要和内置的基本语法实现做比较,由于才疏学浅不知道该怎么简明扼要的描述它的优势。

明显的优势就是在语法和扩展性上直接带来的便捷;让水平不高的我也可以写出清晰优雅的代码。当然写业务前梳理完整的业务状态变换是必要的功课。

状态机可以使用条件分支判断、状态模式和基于DSL来实现,其中更具表达性的DSL也是很多开源状态机的实现方式。

squirrel-foundation(松鼠状态机)

squirrel-foundation有限状态机,我理解可以穷举业务流程状态了。非穷举的我到目前接触的是工作流通过xml描述流程。

通过这个图结合下面的入门的一些API调用可以更好的了解整个过程。

大概的过程分为:定义-》触发-》事件执行-》AOP(处理)-》异常处理

入门案例

StateMachine接口采用四个泛型类型参数。StateMachine<T, S, E, C>

参数解释
T代表已实现状态机的类型 ,, 也就是状态机本体
S代表实现状态的类型
E代表已实现事件的类型
C代表已实现的外部上下文的类型
  1. API声明式的流程声明
 

arduino

代码解读

复制代码

//事件定义 //状态也需要定义这里省略了 enum FSMEvent { ToA, ToB, ToC, ToD }

整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记【点击此处即可】免费获取

typescript

代码解读

复制代码

//初始化定义 事件相应对应的方法声明StateMachineSample UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(StateMachineSample.class); //状态从A->B 事件 FSMEvent.ToB 对应的处理函数 fromAToB builder.externalTransition().from("A").to("B").on(FSMEvent.ToB).callMethod("fromAToB"); //多了个过滤事件的控制when 里面的Condition是上下文传递的对象 builder.externalTransition().from("A").to("B").on(FSMEvent.ToB).when(new Condition<Object>() { @Override public boolean isSatisfied(Object o) { Integer test=(Integer) o; if(test.intValue()>5){ return true; }else { return false; } } @Override public String name() { return null; } }).callMethod("fromAToB"); //当前状态为B时,进入状态B builder.onEntry("B").callMethod("ontoB");

2. 注解声明式的流程声明

 

less

代码解读

复制代码

@Transitions({ @Transit(from = "A", to = "B", on = "FSMEvent.ToB", callMethod = "fromAToB") }) //@State定义每个状态,name状态名称,entry进入状态时调用的方法,exit 离开状态是调用的方法,initialState 为true时,为默认状态 @States({ @State(name = "FSMEvent.ToB", entryCallMethod = "entry", exitCallMethod = "exit", initialState = true) })

3. 环绕事件:可以注解也可以覆盖实现方法 参考上面流程图

事件的环绕方法可以理解为AOP的操作,从下面支持的事件中可以看出还是很丰富的。

 

less

代码解读

复制代码

@OnTransitionBegin @OnBeforeActionExecuted @OnTransitionDecline @OnActionExecException @OnAfterActionExecuted @OnTransitionComplete @OnTransitionEnd @OnTransitionException

4. 上面的都是约定,这里是使用的入口API

 

ini

代码解读

复制代码

//状态A->B的流程触发 UntypedStateMachine fsm = builder.newStateMachine("A"); //6是上下文传递的对象 也可以不传递。实际使用的时候一般传的状态对应的单据对象 例如订单、审批、活动流程 fsm.fire(FSMEvent.ToB, 6);

缺点
  1. 单纯的第三方库,做web的话没有直接集成到spring中-》这里就引出了另一个问题就是想在状态转换过程中直接使用spirng的事务控制,网上看到的是拿到applicationContext采用了编程式事务。
最后提一点

对于一些主要数据的状态例如支付信息处理代码中的控制外,不会轻易手工处理的,这里有必要对数据库层面做一些触发器的约束,数据完整性可以用MD5进行处理。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值