状态机

简介: 首先需要考虑涉及到哪些状态节点和哪些事件,如何方便状态节点的获取、状态节点如何串联起来呢?串联的方式下,如何拿到下一个状态节点?如果基于角色,如何实现?我们知道工作流可以实现基于角色进行流程的流转,但是此时我们涉及到事件和状态,会出现多个分支,如果使用工作流实现,流程处理上,比如activiti上,可能比较复杂,因此考虑比较轻量级的状态机来实现的话,相对来说要方便一些。

     下面的内容基于https://github.com/alibaba/COLACOLA 是 Clean Object-Oriented and Layered Architecture的缩写,代表“整洁面向对象分层架构”。 目前COLA已经发展到COLA v4

一、如何实现一个状态机?

     首先需要考虑涉及到哪些状态节点和哪些事件,如何方便状态节点的获取、状态节点如何串联起来呢?串联的方式下,如何拿到下一个状态节点?如果基于角色,如何实现?

我们知道工作流可以实现基于角色进行流程的流转,但是此时我们涉及到事件和状态,会出现多个分支,如果使用工作流实现,流程处理上,比如activiti上,可能比较复杂,因此考虑比较轻量级的状态机来实现的话,相对来说要方便一些。

1)相关状态初始化,比如:STATE1, STATE2, STATE3, STATE4

2)相关事件:比如:EVENT1, EVENT2, EVENT3, EVENT4, INTERNAL_EVENT

3)状态节点上下文:context,主要包括状态节点类型、状态节点

构建状态节点分支相关接口信息:

From  从哪个状态节点开始

To  需要到的目标状态节点

When 定义过渡期间要执行的操作 perform

Condition  满足条件时,可以从from到to状态节点

因此可以想到我们需要构建状态机的构建器必然需要:

StateMachineBuilder 状态机构建器

数据结构:状态、事件

方便构建对应的transition

其中transition中包括的方法:

构建方法:build

指定初始状态  initialState

内部过渡: internalTransition

外部过渡:externalTransition

外部过渡列表:external Transitions

没有匹配策略:noMatchStrategy

StateMachineFactory 状态机工厂涉及的方法:

构建状态机

注册状态机

展示状态机

展示状态机uml

节点操作:

基于node的数据结构进行构建,配合使用from、to、condtion、link

with设置对应的布局

使用状态的步骤:

创建stateMachineBuilder对象

基于条件进行状态节点指向构建 initiaState、from、to、on、when、perform

基于状态机id进行构建 stateMachine

执行fireEvent操作,fire的过程中拿到下一个状态节点setNextState(source,request)

二、状态机信息流程

可以参考COLA里面的test,可以看到COLA的具体代码实现。

image-20221127123011098.png

三、展示状态机信息效果

image-20221127123206377.png

总体来说cola的状态机还是蛮实用的。

基于cola的状态机还可以实现复杂的状态-事件流转。如下图所示:

image-20221127124642866.png

四、状态机的使用场景

审批流程、订单状态流转等。


目录
相关文章
|
消息中间件 缓存 前端开发
COLA架构 入门
COLA架构 入门
4407 0
|
8月前
|
监控 架构师 NoSQL
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
|
搜索推荐 NoSQL 关系型数据库
COLA架构
COLA架构
4815 0
COLA架构
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1564 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
传感器 数据可视化 JavaScript
状态机(State Machines):理解、设计和应用有限状态机
状态机(State Machines)是一种强大的计算模型和设计工具,用于建模和控制有限状态的系统和行为。无论是在软件开发、自动化控制、游戏设计还是其他领域,状态机都发挥着关键作用。本博客将深入探讨状态机的概念、工作原理以及如何在不同应用中设计和应用它们。
10570 78
|
Java 测试技术 开发者
COLA-statemachine事务失效踩坑
cola-statemachine是阿里开源项目COLA中的轻量级状态机组件。最大的特点是无状态、采用纯Java实现,用Fluent Interface(连贯接口)定义状态和事件,可用于管理状态转换场景。比如:订单状态、支付状态等简单有限状态场景。在实际使用的过程中笔者曾发现状态机内事务不生效的问题,经过排查得到解决,以此记录一下
2461 1
|
XML 数据可视化 安全
给 DSL 开个脑洞:无状态的状态机
什么是 DSL ?DSL 是一种工具,其核心价值在于提供了一种手段,可以更加清晰地就系统某部分的意图进行沟通。本文将通过实现一个状态机引擎来看清 DSL 的本质,介绍状态机的核心模型和 Fluent 接口,并解决状态机的性能问题。
2148 0
给 DSL 开个脑洞:无状态的状态机
|
SpringCloudAlibaba Cloud Native Dubbo
SpringBoot和SpringCloud,SpringCloudAlibaba版本依赖关系
由于 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 3.0 和 2.4 分别为分界线,同时维护 2022.x、2021.x、2.2.x 三个分支迭代。如果不想跨分支升级,如需使用新特性,请升级为对应分支的新版本。 为了规避相关构建过程中的依赖冲突问题,我们建议可以通过 云原生应用脚手架 进行项目创建。
1323 0
SpringBoot和SpringCloud,SpringCloudAlibaba版本依赖关系
|
设计模式 Java 测试技术
Spring状态机的实现原理和业务场景
**Spring State Machine**是Spring框架的一部分,它提供了一种实现状态机的方式,允许开发者定义状态机的状态、事件、行为和转换。状态机是一种计算模型,根据一系列规则从一个状态转移到另一个状态。【5月更文挑战第4天】
958 2