龙空技术网

有限状态机

莫愆 121

前言:

现时姐妹们对“java状态机”大致比较注意,你们都需要学习一些“java状态机”的相关内容。那么小编同时在网上收集了一些对于“java状态机””的相关内容,希望小伙伴们能喜欢,大家一起来学习一下吧!

今天咱接着读书吧,今天这一章说的是与现实世界共舞。

就是说现实世界纷繁复杂,基于事件来编程可以更好地完成目标。

作者提到了4个实现的策略:有限状态机、观察者模式、发布/订阅、反应式编程和流。

咱今天先聊第一个吧。

有限状态机

一个状态机基本上就是一个如何处理事件的规范。

它由一组状态组成,其中一个是当前状态。

对于每个状态,我们列出对该状态有意义的事件。

对于每一个事件,我们定义系统的新的当前状态。

感觉上有限状态机能用到的地方挺多的。

比如审批流,先是待审批,然后事件包括通过和驳回,如果是通过,就去下一步,如果驳回就重新打开。当然也可以有其他的审批流程,看具体如何定义了。

比如单据的流转,待付款、待付款状态可以接受的事件是取消,和付款;取消后变成已取消,付款后变成待发货……

我上面提到的这些都是比较明确的抽象,有比较明确状态和事件。

作者举了另外一个例子,算是打开了我的思路。

例子是,读取文本中的所有字符串,字符串通过一对双引号"括起来,比如这样"你好,我是莫愆",但是有一种比较特殊的情况是转义字符,比如这样"moqian says:\"hello\"",其中\"是转义字符,它们两个在一起代表了一个字符,而不是代表字符串的开始和结束。

作者用Ruby写了一个例子:

这是规则定义,大括号前的当前状态,=>前的是事件,[]中括号里的是返回值,前面的是新状态,后面的是要进行的操作。

以中间那个in_string为例,in_stirng为当前状态,代表现在真正一个字符串中,它可以接收3个事件,双引号,反斜杠,其他值(默认),如果是双引号,就把状态改为寻找新的字符串,并结束当前字符串;如果是反斜杠,就把状态改为复制下一个字符,并把当前字符写入;如果是其他值,则状态不变,还是保持在字符串中的状态,并把当前字符写入。

image-20221001231526475

上面是定义,下面是具体的实现:

image-20221001233449880

用java实现的话会稍稍有些不同,毕竟java不能一次性返回两个返回值,把返回值给包装一下就能完成了,而且它这种二维数组的取值方式,java里也不能这么用,真是数组的话,只能传下标,不能传字符串。

领会思想就好了,具体的实现都好说。

有限状态机并不能处理所有事件相关的事情,所以,我们明天接着聊其他的方式。


标签: #java状态机