Skip to content

Latest commit

 

History

History
54 lines (38 loc) · 2.54 KB

File metadata and controls

54 lines (38 loc) · 2.54 KB
name metaframe-state-pattern
category engineering
description 状态模式 | Code & Engineering

状态模式

英文名: State Pattern
分类: 编码实践
作者: Gamma, Helm, Johnson, Vlissides, 1994
复杂度: intermediate
成熟度: foundational
AI 相关: ❌ 否

简介

允许对象在内部状态改变时自动改变其行为,使其看起来像改变了类

核心概念

  • 上下文:行为发生变化的对象;它将所有状态相关请求委托给当前状态对象,并持有可在运行时交换的引用
  • 状态接口:定义跨状态不同的所有行为契约,确保上下文可以统一处理所有状态
  • 具体状态:封装一个特定状态的行为和转换逻辑,用专注、单一职责的类替代大型条件语句

使用步骤

  1. 识别状态:枚举上下文对象可能处于的所有不同状态及其转换关系
  2. 定义状态接口:声明所有随状态变化的上下文行为方法;每个具体状态必须实现此接口
  3. 实现具体状态类:每个状态一个类,各自实现该状态下的适当行为,并在满足条件时通过调用 context.setState() 触发转换
  4. 配置上下文类:持有对当前状态对象的引用,将行为调用委托给它,并暴露 setState() 使状态对象能驱动转换
  5. 初始化和转换:在上下文构造函数中设置初始状态,让状态机运行,由具体状态或上下文响应事件触发转换

适用场景

['对象的行为严重依赖于当前状态,并且必须随运行时状态转换而改变', '处理状态相关逻辑的大型 switch/if-else 块变得难以维护和扩展', '对工作流、协议解析器、UI 向导或具有不同操作模式的游戏角色进行建模']

最佳实践

✅ 推荐做法

  • 允许状态对象相互了解,或在上下文上使用命名状态常量,使转换显式且可审计
  • 保持每个具体状态类小巧,专注于一个状态的行为,以保持单一职责
  • 将状态模式与事件日志记录结合使用,为每次状态转换创建审计追踪,便于调试和监控

❌ 避免做法

  • 不要将转换逻辑分散在状态类和上下文两者中——选择一个位置并保持一致
  • 如果状态对象是无状态的,不要在每次转换时创建新的状态对象——共享享元实例以避免分配开销
  • 不要对简单的双状态切换使用状态模式;布尔字段更清晰,过度设计更少

Sources: SDFrame (Software Design) MetaFrame: 💻 Code & Engineering / 编码与工程