imn1
2020-09-22 14:49:25 +08:00
比较关键是状态有限(可以全部列举),每个状态都是固定的,只会出现不同的状态,而单个状态本身不变
服务器场景我不熟,但可以从其他方面说一下问题 2
1.有序的状态切换,这个有序是固定的、必经的,每个状态都要轮训一遍
例如上述订单流程
2.无序但有限几个状态之间无级切换,每次状态改变需要做固定接口的处理
例如有限个外观主题之间切换
我在一个 GUI 项目里面用了十多个状态机,处理一些独立的控件 event,这些控件不会和其他控件组合,一旦改变就会直接执行程序,这样只要控件的参数值有限,类型只有一个,多少个参数值就是多少个状态了
其实可以这样说,GUI 的控件都是固定的,程序就是处理控件产生的参数改变和组合而已,理论上可以全部用状态机写,理论上;只是有些参数值和类型太多,多个控件组合出来的状态可能无穷多,状态机无法全部列举而已
状态机是省代码和省思考,因为状态固定,状态进出处理的函数也固定(不太复杂),要想的就是状态变化的可能,穷举列出来而已
目前我所知的状态机处理第二种还是比较麻烦的,例如 3 种状态,要列明 1-2, 2-1, 1-3, 3-1, 2-3, 3-2 等所有排列组合情况,比较好的是如果这些 123 状态只是简单的标识区别,可以 for+排列组合 来完成这个定义,如果复杂一些就不好使了,还不如写个变参函数方便
顺便也举个不适用例子,也是这个 GUI 项目,最初想把语言切换(汉英)也写成状态机,后来考虑到将来要增加语言(日韩……),而且语言变化还有细微不同(状态不完全固定),感觉用状态机是给自己挖坑,就放弃了,改用事件信号+函数