🚦
一句话理解:状态模式把对象在不同状态下的行为封装到独立状态对象中,使对象切换状态时也随之切换行为。

它解决什么问题

角色的 Idle、Move、Attack、Stun 逻辑若集中在一个类里,通常会形成大型 switch,并散落大量“当前状态是否允许”的判断。状态模式把每个状态的行为和转换规则放回对应状态。

C# 示例

实际 Unity 项目可让 MonoBehaviour.Update 调用状态机的 Tick,并把 Rigidbody、Animator 等依赖通过上下文提供给状态。

转换由谁决定

  • 状态决定:规则聚合在状态内部,扩展局部状态方便。
  • 状态机决定:转换图更集中,便于可视化和审查。
  • 独立 Transition 对象:适合复杂、数据驱动的状态机。
选择一种主要策略,避免转换逻辑四处分散。

状态模式与 FSM

有限状态机强调有限状态集合和转换规则;状态模式是实现这些行为的一种面向对象手段。简单 FSM 用枚举和 switch 完全合理,复杂后再拆状态对象。

注意事项

明确进入、更新、退出的调用顺序;处理重入转换;避免每帧创建状态对象;为动画事件和异步任务提供取消机制。

小结

状态模式不是为了消灭所有条件判断,而是让与某个状态相关的行为和转换规则待在一起。复杂度不足时,枚举状态机更直接。