| name | metaframe-state-pattern |
|---|---|
| category | engineering |
| description | 状态模式 | Code & Engineering |
英文名: State Pattern
分类: 编码实践
作者: Gamma, Helm, Johnson, Vlissides, 1994
复杂度: intermediate
成熟度: foundational
AI 相关: ❌ 否
允许对象在内部状态改变时自动改变其行为,使其看起来像改变了类
- 上下文:行为发生变化的对象;它将所有状态相关请求委托给当前状态对象,并持有可在运行时交换的引用
- 状态接口:定义跨状态不同的所有行为契约,确保上下文可以统一处理所有状态
- 具体状态:封装一个特定状态的行为和转换逻辑,用专注、单一职责的类替代大型条件语句
- 识别状态:枚举上下文对象可能处于的所有不同状态及其转换关系
- 定义状态接口:声明所有随状态变化的上下文行为方法;每个具体状态必须实现此接口
- 实现具体状态类:每个状态一个类,各自实现该状态下的适当行为,并在满足条件时通过调用 context.setState() 触发转换
- 配置上下文类:持有对当前状态对象的引用,将行为调用委托给它,并暴露 setState() 使状态对象能驱动转换
- 初始化和转换:在上下文构造函数中设置初始状态,让状态机运行,由具体状态或上下文响应事件触发转换
['对象的行为严重依赖于当前状态,并且必须随运行时状态转换而改变', '处理状态相关逻辑的大型 switch/if-else 块变得难以维护和扩展', '对工作流、协议解析器、UI 向导或具有不同操作模式的游戏角色进行建模']
- 允许状态对象相互了解,或在上下文上使用命名状态常量,使转换显式且可审计
- 保持每个具体状态类小巧,专注于一个状态的行为,以保持单一职责
- 将状态模式与事件日志记录结合使用,为每次状态转换创建审计追踪,便于调试和监控
- 不要将转换逻辑分散在状态类和上下文两者中——选择一个位置并保持一致
- 如果状态对象是无状态的,不要在每次转换时创建新的状态对象——共享享元实例以避免分配开销
- 不要对简单的双状态切换使用状态模式;布尔字段更清晰,过度设计更少
Sources: SDFrame (Software Design) MetaFrame: 💻 Code & Engineering / 编码与工程