iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >COLA中的cola-statemachine状态机理解与使用例
  • 258
分享到

COLA中的cola-statemachine状态机理解与使用例

java开发语言后端github 2023-09-08 13:09:35 258人浏览 安东尼
摘要

cola-stateMachine状态机理解与使用例 一、cola-statemachine介绍二、COLA状态机的核心概念三、使用状态机1. 环境配置2. cola状态机的三种transit

cola-stateMachine状态机理解与使用例

一、cola-statemachine介绍

COLA框架的状态机组件是一种轻量级的、无状态的、基于注解的状态机实现,可以方便地管理订单等业务对象的状态转换。COLA框架的状态机使用了连贯接口Fluent Interfaces)来定义状态和事件,以及对应的动作和检查。COLA框架的状态机是COLA 4.0应用架构的一部分,旨在控制复杂度,提高开发效率。

COLA框架的状态机的优势有以下几点:

  • 简化了状态转换的逻辑,避免了大量的if-else判断
  • 提高了代码的可读性和可维护性,方便了单元测试和重构
  • 支持多种状态机模式,如同步、异步、延迟等
  • 与COLA框架的其他组件协同工作,实现领域驱动设计和六边形架构

二、COLA状态机的核心概念

  1. State:状态
  2. Event:事件,状态由事件触发,引起变化
  3. Transition:流转,表示从一个状态到另一个状态
  4. External Transition:外部流转,两个不同状态之间的流转
  5. Internal Transition:内部流转,同一个状态之间的流转
  6. Condition:条件,表示是否允许到达某个状态
  7. Action:动作,到达某个状态之后,可以做什么
  8. StateMachine:状态机

状态机领域模型

三、使用状态机

1. 环境配置

我的配置

Maven: 3.6.3SDK: 17Language level:8

引入依赖:

<dependency><groupId>com.alibaba.colagroupId><artifactId>cola-component-statemachineartifactId><version>4.3.1version>dependency>

2. cola状态机的三种transition方式

StateMachineBuilder<States, Events, Context> builder = StateMachineBuilderFactory.create();        //external transition        builder.externalTransition()                .from(States.STATE1)                .to(States.STATE2)                .on(Events.EVENT1)                .when(checkCondition())                .perfORM(doAction());        //internal transition        builder.internalTransition()                .within(States.STATE2)                .on(Events.INTERNAL_EVENT)                .when(checkCondition())                .perform(doAction());        //external transitions        builder.externalTransitions()                .fromAmong(States.STATE1, States.STATE2, States.STATE3)                .to(States.STATE4)                .on(Events.EVENT4)                .when(checkCondition())                .perform(doAction());        builder.build(machineId);        StateMachine<States, Events, Context> stateMachine = StateMachineFactory.get(machineId);        stateMachine.showStateMachine();

3、接口方法说明

a. StateMachineBuilder

StateMachineBuilder方法说明
ExternalTransitionBuilder externalTransition()用于一个流转的构建器
ExternalTransitionsBuilder externalTransitions()用于多个流转的构建器
InternalTransitionBuilder internalTransition()开始构建内部流转
StateMachine build(String machineId)对状态机开始构建,并在StateMachineFactory中注册

b. StateMachine

StateMachine方法说明
boolean verify(S sourceStateId, E event)验证一个事件E是否可以从当前状态S触发
S fireEvent(S sourceState, E event, C ctx)向状态机发送一个事件E,触发状态机,并返回目标状态
String getMachineId()获取状态机的标识符MachineId
void showStateMachine()使用访问者模式来显示状态机的结构

四、简单场景使用演示

0. 订单流程模拟(基本配置)

// 订单状态(States)enum OrderState {INIT,PaiD,  DELIVERED,   REFUNDED;}// 订单事件(Events)enum OrderEvent {PAY_SUCCESS,PAY_FAIL,DELIVERED_SUCCESS,REFUND_SUCCESS;}// 订单(Context)static class Order {String operator = "frank";String orderId = "123465";}static String MACHINE_ID = "orderStateMachine";

1. 外部状态流转(单个起始状态)

外部过程描述:起始状态INIT,结束状态PAID,当发生PAY_SUCCESS时执行状态流转,当满足checkCondition()时,执行doAction,执行成功则返回状态PAID,否则返回INIT

@Testpublic void testExternalNormal(){    // 第一步:生成一个状态机builder    StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();    // 第二步:设置一个外部状态转移类型的builder,并设置from\to\on\when\perform    builder.externalTransition()            .from(OrderState.INIT)            .to(OrderState.PAID)            .on(OrderEvent.PAY_SUCCESS)            .when(checkCondition())            .perform(doAction());    // 第三步:设置状态机的id,并在StateMachineFactory中的stateMachineMap进行注册    StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID);    // 第四步:触发状态机    OrderState target = stateMachine.fireEvent(OrderState.INIT, OrderEvent.PAY_SUCCESS, new Order());    assertEquals(OrderState.PAID, target);}

a. checkCondition(示例)

private Condition<Order> checkCondition() {    return order -> {        System.out.println("Check condition : " + order);        return true;    };}

方法体中使用了lambda表达式来创建一个Condition的实例,并返回它

b. doAction(示例)

private Action<OrderState, OrderEvent, Order> doAction() {    return (from, to, event, ctx) -> {        System.out.println(                ctx.operator + " is operating " + ctx.orderId + " from:" + from + " to:" + to + " on:" + event));    };}

这段代码定义了一个私有方法,返回一个Action对象,该对象是一个函数式接口,接受四个参数:from, to, event, ctx,并执行一些逻辑。

  • from: 表示状态转移的源状态
  • to: 表示状态转移的目标状态
  • event: 表示触发状态转移的事件
  • ctx: 表示状态机的上下文对象

这个Action对象的逻辑是打印出一条信息,显示操作者、实体ID、源状态、目标状态和事件。例如:

frank is operating 123456 from:INIT to:PAID on:PAY_SUCCESS

这样可以方便地跟踪和调试状态机的运行情况。

2. 内部状态流转

内部过程描述:这个内部转换发生在PAID状态下,当发生DELIVERED_SUCCESS时执行状态流转,当满足checkCondition()时,执行doAction,执行成功则返回状态PAID

@Testpublic void testInternalNormal(){    StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();    builder.internalTransition()            .within(OrderState.PAID)            .on(OrderEvent.DELIVERED_SUCCESS)            .when(checkCondition())            .perform(doAction());    StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID + "1");    OrderState target = stateMachine.fireEvent(OrderState.PAID, OrderEvent.DELIVERED_SUCCESS, new Order());    assertEquals(OrderState.PAID, target);}

3. 外部状态流转(多个起始状态)

外部过程描述:起始状态PAIDDELIVERED,结束状态REFUNDED,当发生REFUND_SUCCESS时执行状态流转,当满足checkCondition()时,执行doAction,执行成功则返回状态REFUNDED,否则返回对应起始状态

@Testpublic void testExternalTransitionsNormal(){    StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();    builder.externalTransitions()            .fromAmong(OrderState.PAID, OrderState.DELIVERED)            .to(OrderState.REFUNDED)            .on(OrderEvent.REFUND_SUCCESS)            .when(checkCondition())            .perform(doAction());    StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID + "2");    OrderState target = stateMachine.fireEvent(OrderState.PAID, OrderEvent.REFUND_SUCCESS, new Order());    assertEquals(OrderState.REFUNDED, target);}

4. 多个流转组合

@Testpublic void testExternalInternalNormal(){StateMachineBuilder<OrderState, OrderEvent, Order> builder = StateMachineBuilderFactory.create();builder.externalTransition()...builder.internalTransition()...builder.externalTransition()...builder.externalTransitions()...StateMachine<OrderState, OrderEvent, Order> stateMachine = builder.build(MACHINE_ID + "3");}

五、相关链接

  1. 相关Maven引用地址:https://search.maven.org/search?q=g:com.alibaba.cola
  2. 实现一个状态机引擎,教你看清DSL的本质:https://blog.csdn.net/significantfrank/article/details/104996419
  3. 阿里开源COLA 4.0 - 项目实践:https://www.jianshu.com/p/6a00d6912f45
  4. COLA下的cola-statemachine状态机:https://www.jianshu.com/p/895047a04ae5

来源地址:https://blog.csdn.net/qq_40890575/article/details/129495003

--结束END--

本文标题: COLA中的cola-statemachine状态机理解与使用例

本文链接: https://www.lsjlt.com/news/399954.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • COLA中的cola-statemachine状态机理解与使用例
    cola-statemachine状态机理解与使用例 一、cola-statemachine介绍二、COLA状态机的核心概念三、使用状态机1. 环境配置2. cola状态机的三种transit...
    99+
    2023-09-08
    java 开发语言 后端 github
  • Vuex状态机的快速了解与实例应用
    目录一. 速识概念:1. 组件之间共享数据的方式:2. vuex是什么:二. 基本使用:三.创建项目:四. 讲解前提:五.核心概念:1.state:1.1 组件中访问state的第一...
    99+
    2024-04-02
  • Flutter状态管理Provider的使用示例详解
    目录前言计数器全局状态总结前言 Provider是三大主流状态管理框架官方推荐使用的框架,它是基于官方数据共享组件InheritedWidget实现的,通过数据改变调用生命周期中的d...
    99+
    2022-11-13
    Flutter状态管理Provider Flutter Provider
  • Flutter状态管理Bloc使用示例详解
    目录前言两种使用模式Cubit模式最后前言 目前Flutter三大主流状态管理框架分别是provider、flutter_bloc、getx,三大状态管理框架各有优劣,本篇文章将介绍...
    99+
    2022-11-13
    Flutter状态管理Bloc Flutter Bloc
  • Vuex中状态管理器的使用详解
    目录一、Vuex是什么?二、什么时候使用Vuex三、Vuex的核心概念和API四、应用举例五、vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex一、Vuex是什么? Vu...
    99+
    2024-04-02
  • 解析HTTP协议中4xx状态码的使用案例与解决方法
    探索HTTP协议中4xx状态码的应用场景和解决方案引言:在Web开发中,HTTP协议起着非常重要的作用。它定义了客户端和服务器之间进行通信的规则和约定。其中,状态码是服务器用来向客户端传达请求处理情况的一种标识。在HTTP协议中,4xx状态...
    99+
    2023-12-26
    应用场景 解决方案 xx状态码
  • Vue3状态管理的使用详解
    目录背景 Provide / Inject 抽离共享状态提供数据 注入数据 小结 reactive 抽离共享状态使用共享状态 小结 结语 背景 随着Vue3的逐步应用,对状态管理的...
    99+
    2024-04-02
  • React使用有限状态机的实现示例
    目录什么是有限状态机?有限状态机的示例有限状态机和软件开发、计算机科学有什么关系?举了那么多例子,但我该怎么展示在前端开发中使用状态机呢?React 应用程序中的注册表单的传统实现方...
    99+
    2024-04-02
  • React状态管理器Rematch的使用详解
    目录Rematch使用1. Rematch介绍2. Rematch特性3. 基本使用Rematch使用 1. Rematch介绍 Rematch是没有样板文件的Redux的最佳实践,...
    99+
    2024-04-02
  • 如何理解PHP中的无状态传输机制
    PHP中的无状态传输机制 在Web开发中,无状态传输机制是指服务器不会保存客户端的状态信息,每次请求都是独立的,服务器不会保持任何关于客户端状态的信息。PHP作为一种服务器端脚本语言,...
    99+
    2024-03-06
    php无状态传输 php状态管理 php通信机制 表单提交
  • React状态管理Redux的使用介绍详解
    目录1. 简介2. 核心概念3. redux工作流4. 模拟redux工作流程5. 使用redux6. react-redux1. 简介 Redux 是 JavaScript 应用的...
    99+
    2024-04-02
  • react-redux集中式状态管理及基本使用与优化
    目录1、react-redux2、连接容器组件与UI组件3、react-redux基本使用优化1、简写mapState和mapDispatch两个映射方法优化2、Provider组件...
    99+
    2024-04-02
  • vue中使用pinia全局状态管理的实现
    目录与vuex的区别安装引入pinia创建状态目录pinia模块组成创建pinia模块在组件中使用该状态机pinia模块实例中的api讲解状态持久化与vuex的区别 去除了 muta...
    99+
    2024-04-02
  • 更强大的React状态管理库Zustand使用详解
    目录介绍创建项目项目安装项目依赖创建项目结构设置环境变量服务设置 store清除/重置存储介绍 在这篇文章中,我会介绍 Zustand 在实际项目中的使用。 我会构建一个 GitHu...
    99+
    2024-04-02
  • VUE TypeScript与Vuex:开箱即用的状态管理解决方案
    Vue TypeScript 概览 Vue TypeScript 是一个基于 TypeScript 的 Vue.js 框架。它允许您使用 TypeScript 来构建 Vue.js 应用程序,从而可以利用 TypeScript 提供的强...
    99+
    2024-02-08
    Vue TypeScript Vuex 状态管理 前端框架 JavaScript
  • 浅析集中式状态管理Vuex的使用方法
    如何使用集中式状态管理的Vuex?下面本篇文章就带大家了解一下vuex,简单聊聊vuex的使用方法,希望对大家有所帮助!1.vuex是什么一个专门在Vue中实现集中式状态管理的一个Vue插件,可以对vue应用中多个组件的共享状态进行集中式的...
    99+
    2023-05-14
    VueX
  • React各种状态管理器的解读及使用方法
    首先我们要先知道什么是状态管理器,这玩意是干啥的? 当我们在多个页面中使用到了相同的属性时就可以用到状态管理器,将这些状态存到外部的一个单独的文件中,不管在什么时候想使用都可以很方便...
    99+
    2024-04-02
  • 小程序中用户登录状态检查与更新的示例分析
    这篇文章主要介绍小程序中用户登录状态检查与更新的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!将这个部分单独作为一篇文章有两个原因:① wx.getUserInfo...
    99+
    2024-04-02
  • 如何深入理解Java多线程与并发框中线程的状态
    本篇文章给大家分享的是有关如何深入理解Java多线程与并发框中线程的状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 新建状态(New)万事万物都不是凭空出现的,线程也一...
    99+
    2023-06-05
  • React中使用事件驱动进行状态管理的方法
    这篇文章给大家分享的是有关React中使用事件驱动进行状态管理的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。自 Hook 被引入 React  以来,Context API 与 Hook 库在应用...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作