C# 状态机 Stateless 3.0
目录标题
- Stateless 简介
- Stateless 简单用法
- Stateless 初级用法
- Stateless 进阶用法
- .net 库集合
Stateless 简介
Stateless 是基于 C# 实现状态机的库。详见 Github - Stateless
Stateless 简单用法
1 - 定义状态(State)以及不同状态间转换的触发器(Trigger)。
简例中用枚举类型定义 State 及 Trigger:
enum State
{state1,state2,state3
}enum Trigger
{trigger1,trigger2
}
2 - 定义状态机对象:
StateMachine<State, Trigger> _machine = new StateMachine<State, Trigger>(State.state1);
某一时刻,状态机 _machine
处于某一状态,比如 state1
,此时通过不同的 Trigger
可以触发该状态机转变到不同的状态。至于,状态机处于各个状态时,不同的 Trigger
会触发其转换到何种状态,需要对状态机进行配置。
3 - 配置状态机对象:
_machine.Config(State.state1).Permit(Trigger.trigger1, State.state2).Permit(Trigger.trigger2, State.state3);_machine.Config(State.state2).Permit(Trigger.trigger1, State.state3).Permit(Trigger.trigger2, State.state1);
在该配置下,当 _machine
处于 State.state1
时,Trigger.trigger1
可触发其转换到 State.state2
状态, Trigger.trigger2
可触发其转换到 State.state3
状态;当_machine
处于 State.state2
时,Trigger.trigger1
可触发其转换到 State.state3
状态, Trigger.trigger2
可触发其转换到 State.state1
状态。以此类推。
4 - 状态机状态改变触发函数
_machine.Fire(Trigger.trigger1);
当某事件发生时,可通过 .Fire(Trigger tg)
函数触发状态机的状态转换。
Stateless 初级用法
下面介绍一些 Stateless 的基本函数及用法。
1 - Stateless 在某状态下执行的函数。
我们在使用状态机时,不仅希望能通过一定的逻辑设置,使得状态机响应某些事件(Trigger)时,能够转入特定的状态。同时,我们还希望状态机在处于某种状态,或状态转换时,能够执行一些用户操作。Stateless 通过设定一系列的 Action 来实现这样的功能。
_machine.Config(State.state1).OnEntry(t => state1Entry()).OnExit(t => state1Exit()).InternalTransition(Trigger.triggerX, t => state1Tick()).Permit(Trigger.trigger1, State.state2).Permit(Trigger.trigger2, State.state3);void state1Entry() { /* 函数实现 */ }
void state1Exit() { /* 函数实现 */ }
void state1Tick() { /* 函数实现 */ }
其中,.OnEntry(t => state1Entry())
设置了状态机在由其他状态进入到 State.state1
时执行的用户操作。用户操作通过函数 state1Entry() { /* 函数实现 */ }
实现。.OnExit(t => state1Exit())
同理,可以实现离开状态State.state1
时的用户操作。
.InternalTransition(Trigger.triggerX, t => state1Tick())
可以认为是状态机被设置为,在触发器 Trigger.triggerX
作用下可以重复进入State.state1
。比如定时器重复触发事件,执行 _machine.Fire(Trigger.triggerX);
可以使状态机重复 State.state1
状态,即实现 InternalTransition 。此时,执行用户操作 state1Tick() { /* 函数实现 */ }
。
2 - 带参数触发 Trigger with parameter
有时候,某事件发生时,我们不仅希望能触发状态机转换状态,还希望能同时传递一些参数。比如,当定时器事件时,触发状态机重复 State.state2
的 internalTransation,并执行 state2Tick( float tic )
函数,并将定时器的时间传递给该函数。那么,这里就需要用到带参数的触发。
StateMachine<State, Trigger>.TriggerWithParameters<int> _TriggerP= _machine.SetTriggerParameters<int>(Trigger.TriggerP);_machine.Config(State.state2).InternalTransition(_TriggerP, (tick, t) => state2Tick(tic));void state2Tick( int tic ) { /* 函数实现 */ }_machine.Fire(_TriggerP, 100);
同样还有
StateMachine<State, Trigger>.TriggerWithParameters<float> _TriggerP2= _machine.SetTriggerParameters<float>(Trigger.TriggerP2);
_machine.Config(State.state2).PermitIf<float>(_TriggerP2, State3, tp => !ckBool(tp)).PermintIf<float>(_TriggerP2, State1, tp => ckBool(tp));bool ckBool( float tp) { /* 判断返回布尔值*/ }
通过该配置,触发 _TriggerP2
时,同时传递参数 float tp
,通过函数 ckBool( tp )
的真假,决定状态机转入 State.state3
或者 State.state1
。这样增加了状态机的灵活性。
3 - 其他
// on transition action_machine.OnTransitioned(OnTransitionedAction);// on unhandled trigger_machine.OnUnhandledTrigger(OnUnhandledTrigger);void OnTransitionedAction(StateMachine<State, Trigger>.Transition act) { /* 函数实现 */ }void OnUnhandledTrigger(State st, Trigger tg) { /* 函数实现 */ }
如果出现未配置的触发,可以通过设置 .OnUnhandledTrigger(OnUnhandledTrigger)
进行处理。
Stateless 进阶用法
待续
.net 库集合
github 上有大神整理收集了许多优秀的 .net library,如
SharpSCADA
awesome-dotnet-core
awesome-dotnet
ReactiveUI
C# 状态机 Stateless 3.0相关推荐
- Stateless 3.0——.NET Core上的状态机库
Stateless是一个基于C#,创建状态机的简单库,最新版本支持.NET Core 1.0.其实现方式并不是通过.NET Core,而是通过写入.NET Standard实现的.就像Android平 ...
- .Net轻量状态机Stateless
很多业务系统开发中,不可避免的会出现状态变化,通常采用的情形可能是使用工作流去完成,但是对于简单场景下,用工作流有点大财小用感觉,比如订单业务中,订单状态的变更,涉及到的状态量不是很多,即使通过简单的 ...
- C#状态机Stateless
最近在折腾一些控制相关的软件设计,想起来状态机这个东西,对解决一些控制系统状态切换还是挺有用的. 状态机(有限状态自动机)网上有很多介绍.简单理解就是定义一系列状态,通过一系列的事件,可以使得状态可以 ...
- 【转】浅析C# 状态机Stateless
最近在折腾一些控制相关的软件设计,想起来 状态机 这个东西,对解决一些控制系统状态切换还是挺有用的. 状态机(有限状态自动机)网上有很多介绍.简单理解就是定义一系列状态,通过一系列的事件,可以使得状态 ...
- 状态机 Stateless VS StateMachine
[什么是状态机] 一句话概括: 状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型. 来解释什么是"状态"( State ).现实事物是有不同状态的,例如一个自 ...
- 状态机 stateless_Stateless 3.0-.NET Core的状态机库
状态机 stateless State Machines and business processes that describe a series of states seem like they' ...
- 前端状态机系列:SCXML与XState对应关系
1. 前置说明 这次再说明下自己对状态图的看法.状态图虽然有非常多的优势(参考上篇文章),如果你想使用,关于是否对整个旧项目进行全量状态图化,这里给一个适应范围是:项目中复杂的部分进行状态图建模是非常 ...
- COLA 4.0:应用架构的最佳实践
前几天和几个饿了么的同学聊天,一听说他们还在用COLA 1.0,我二话没说,90度鞠躬,赔礼道歉,虚心聆听他们的吐槽.COLA的初衷旨在控制复杂度,救码农于水火,惭愧的是,早期的思想不成熟,设计也多有 ...
- COLA 4.0 - DDD项目实践
更多内容关注微信公众号:fullstack888 COLA分层架构 COLA 4.0 架构分成COLA架构和COLA组件两个部分: COLA架构:关注应用架构的定义和构建,提升应用质量. COLA组件 ...
最新文章
- 树莓派ssh连接问题
- 乐视欠122亿的图标给后浪的启示
- leetcode 两数相加c++_167. 两数之和 II - 输入有序数组
- mysql 5.5 5.6 备份库_mysql5.5备份数据库里面除系统库外的所有数据库
- 将一副图片编译进uboot
- Java基础之路--引用数据类型之数组
- Quotations
- 【紫书第九章】动态规划(DP)常见模型汇总与DP问题分析方法
- 有意思的签到题集合~~
- 大一高等数学期末考试试卷及答案详解
- 数模笔记:蒙特卡洛模型
- java期末复习题目
- python图像质量评价_图像质量评价和视频质量评价(IQA/VQA)
- 人教版,北师大版,北京版和苏教版的四年级数学知识点对比(附视频)
- gRPC源码阅读及实践之 Resolver
- 算法原理系列:红黑树
- 求职季之你必须要懂的原生JS(中)
- 企业邮箱网页登录入口,网页电子邮箱怎么注册?
- 2、oracle全文检索
- 个人作业--四则运算3