在Kotlin中实现一个十分简单的自循环状态机
· 阅读需 4 分钟
在平日的编码生活中,你有没有遇到过需要通过状态机来实现的逻辑呢?一个状态的轮转、事件订阅的通讯处理等。 状态机的实现方式千变万化,这里我会为你介绍一个简单的自循环状态机实现。
简单介绍
在开始之前,我先说明一下这个所谓的 "自循环状态机" ,避免歧义。这个词儿是我自己编出来的, 意为这个状态机中的 动作 与 变换 均由状态本身来完成。
用大家都喜欢的大白话来讲,就是 "状态" 是一个 class,它自己包括了它的 "行为" —— 也就是一个可执行方法,
然后这个方法的返回值便是下一个将被 "变换" 的 "状态" 。
文字表述还是缺乏力量,接下来便用代码来为你展示。
实现
类型定义
让我们来定义状态机中不断轮转的状态。
public abstract class State<S : State<S>> {
/**
* 行为.
* @return 下一个状态,或结束循环。
*/
public abstract operator fun invoke(): S?
}
那么最基础的抽象定义便结束了。很简单不是吗?
[!info] 根据业务需求,
invoke也可以适当地调整,比如让它变为suspend可挂起的。
自循环扩展
定义完了非常简单的状态类型 State,接下来就是实现它的 "自循环"。
State 的自循环其实很简单:提供一个初始状态,然后不断地循环,
用 invoke 的结果来代替当前的状态,直到循环结束。