状态机的建立不一定要针对某个具体的业务对象。它取决于设计目的和应用场景,可以从多个层面来建立状态机。
1.传统的业务对象状态机
最常见的情况是针对具体业务对象:
python
class Order: state: OrderState # PENDING → PAID → SHIPPED → DELIVERED
2.非业务对象的应用场景
a. 流程/工作流状态机
审批流程:
SUBMITTED → REVIEWING → APPROVED/REJECTED部署流程:
BUILD → TEST → DEPLOY → VERIFY
b. UI/交互状态机
javascript
// 组件交互状态 const UIState = { IDLE: 'idle', LOADING: 'loading', SUCCESS: 'success', ERROR: 'error' }c. 协议/通信状态机
TCP连接:
CLOSED → LISTEN → ESTABLISHED → CLOSE_WAIT认证流程:
UNAUTHENTICATED → AUTHENTICATING → AUTHENTICATED
d. 算法/计算状态机
解析器状态:
READING → PARSING → VALIDATING → COMPLETE游戏AI状态:
PATROL → CHASE → ATTACK → RETREAT
3.抽象层次的状态机
a. 子系统状态机
python
class PaymentSubsystem: state: SystemState # INITIALIZING → READY → PROCESSING → DEGRADED
b. 会话/上下文状态机
用户会话:
NEW → ACTIVE → IDLE → TERMINATED事务上下文:
BEGIN → IN_PROGRESS → COMMITTING → DONE
4.何时不需要绑定业务对象
适合使用非业务对象状态机的场景:
控制流程导向:当主要关注流程控制而非数据状态时
跨对象协调:多个对象需要协同完成某个流程
临时状态管理:状态生命周期短暂,不适合绑定持久化对象
基础设施层:技术层面的状态转换
实际案例:
typescript
// 文件上传管理器(不是针对某个业务对象) enum UploadSessionState { INITIALIZING = 'initializing', UPLOADING = 'uploading', PROCESSING = 'processing', COMPLETED = 'completed', FAILED = 'failed' }5.设计考虑
优点(不绑定业务对象):
更灵活:可以管理跨领域的状态流转
更专注:只关心状态逻辑,不耦合业务数据
更可复用:通用状态机可以在多个上下文中使用
需要考虑的问题:
状态持久化:如何保存和恢复状态?
状态归属:谁拥有这个状态机?
事件溯源:状态变更如何与业务事件关联?
6.建议
按需设计:
如果状态主要是业务数据的属性→ 绑定业务对象
如果状态主要是流程的控制逻辑→ 可以考虑独立状态机
混合使用:
python
class OrderService: # 业务对象状态机 order_state: OrderState # 服务处理状态机(独立) processing_state: ServiceState # IDLE → PROCESSING → WAITING → COMPLETE
总结:状态机的建立取决于你管理的是什么类型的状态转换。业务对象状态机是最常见的,但在流程控制、系统协调、UI交互等场景中,建立独立的状态机往往是更清晰的设计选择。关键是识别出状态的本质——是数据的属性,还是流程的控制点。