状态机:围绕状态,而不是围绕具体流程
状态机的核心是围绕状态,而不是围绕具体流程。当前状态、输入、转移状态,就是围绕着三要素设计的。它可以把一个超长流程、超多条件判断的流程,解耦为一个个独立的状态。 核心:围绕状态,而不是围绕具体流程 状态机的核心是围绕状态,而不是围绕具体流程。 当前状态、输入、转移状态,就是围绕着三要素设计的。 这个模式,可以把一个超长流程、超多条件判断的流程,解耦为一个个独立的状态。 将时序和条件判断,解耦为独立的状态,状态受输入/事件的影响,转移状态。 是一种分治,是一种将大的易变的脆弱流程,转换为一个个独立的、不易变的状态处理,也就是状态机。 状态机不是一种算法,而是一种通过"降维拆解"来控制复杂度的设计哲学。 它把混沌庞大的系统,解耦成了一个个简单、确定、封闭的小状态。 状态机不是循环,只是表现像循环。 我现在是 State A。如果来信号 X,我就变 State B;如果来信号 Y,我就变 State C。(循环只是状态切换过程中产生的一种表现形式) 状态机的核心四大要素 状态(State):系统当前所处的情境(如"关门"、“开门”); 输入(Input):触发变化的外部信号(如"按下开门按钮"); 转移(Transition):从一个状态变到另一个状态的过程; 输出(Output):系统在特定状态或转移时执行的动作(如"响铃")。 状态机和循环流程的区别 状态机和循环流程看起来确实非常像,但它们在设计思想、状态控制权以及处理复杂度的能力上有本质的区别: 维度 普通循环流程(Loop / Flowchart) 状态机(State Machine) 控制中心 代码行/指令指针(PC):按预设顺序一行行往下走 “状态"本身:当前处于什么状态,直接决定能响应什么信号 执行逻辑 主控驱动:A -> B -> C -> 再循环,路线基本固定 事件驱动:没有固定的下一步,完全看此时来了什么输入 分支处理 靠大量的 if-else 或 switch 嵌套,条件极易膨胀 状态独立隔离,只处理当前状态下合法的事件,拒绝非法输入 记忆能力 依赖全局变量或多层局部变量来标记"走到哪一步了” 状态本身就是记忆,当前处于哪个状态,就代表了过去发生的一切 状态机也是解耦 状态机解耦的是:“行为(做什么)“与"时序/条件判断(什么时候能做)”。 状态机通过把系统拆成"状态"和"事件”,实现了以下四个维度的彻底解耦: 1. 解耦:逻辑与当前上下文(消灭全局 Flag 泥潭) 传统代码(紧耦合):为了记住系统"走到哪一步了",你不得不定义一堆全局变量或布尔标志位(Flag): if is_logged_in and not is_paying and is_verified and has_coupon: # 你必须在每一个逻辑里,手动判断这一大串 Flag 的组合 问题:变量越多,组合情况成指数级爆炸(2^n),你根本记不清 is_paying 为 True 时,has_coupon 能不能为 True。 ...