用map实现状态机的核心是将“状态→行为”转化为可查、可配、可扩展的映射关系,替代硬编码分支;支持状态处理、迁移约束、上下文统一传递及控制台调度等场景,轻量解耦易维护。

用 Map 实现状态机,核心是把“状态 → 行为”变成可查、可配、可扩展的映射关系,而不是靠一堆 if-else 或 switch 去硬编码分支逻辑。它轻量、解耦、易维护,特别适合业务规则明确但后续可能新增状态的场景,比如订单流转、表单步骤、权限跳转或简易控制台交互。
用 Map 存状态与行为的绑定
定义一个 Map<stateenum consumer>></stateenum>(或 Function/Runnable),键是当前状态,值是该状态下应执行的动作逻辑:
- 每个状态对应一个纯函数式处理逻辑,比如
handlePaid()、handleShipped() - 主流程只需根据当前状态查 Map,拿到函数就执行:
handlers.get(currentState).accept(context) - 新增状态?加一个枚举值 + put 一行映射,主逻辑完全不动
用 Map 管理状态转换规则
状态机不止要“做什么”,还要“能变成什么”。可用嵌套 Map 表达状态迁移约束:
Map<stateenum map stateenum>> transitions</stateenum>- 例如:
transitions.get(PENDING).get(PAY_EVENT) → PAID,表示待支付状态下收到支付事件,应转为已支付 - 执行时先校验是否允许该事件触发转换,再更新状态并调用对应 handler
配合上下文对象统一传参
避免每个 handler 都去取数据库、查缓存、拼参数。封装一个 Context 对象(如 OrderContext),包含状态、业务数据、校验结果等:
- 所有 handler 都接收同一个 Context 实例,逻辑聚焦在“状态语义”而非“数据搬运”
- 状态变更后,Context 中的
currentState字段同步更新,下次查 Map 就自然走新分支 - 必要时可在 Context 中加入
before()/after()钩子,统一做日志、幂等、事务开启等横切操作
控制台或简单流程中的实用变体
在无框架的 Java 控制台项目里,Map 还能承担更直接的调度角色:
- 用
Map<string runnable></string>绑定菜单选项和动作,输入“2”就执行map.get("2").run() - 用
Map<string string></string>做角色到主界面的映射,登录后查 role → menu 名,再跳转对应子流程 - 所有映射初始化集中在一个地方,增删改不碰主循环,也不动 if 判断链











