元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
UML基础
▶
核心概念
UML发展历史
UML组成要素
建模方法论
▶
图类型总览
结构型图表
行为型图表
交互型图表
▶
结构型图表
▶
类图
类图概述
类关系解析
类图实战案例
▶
行为型图表
▶
活动图
流程图进阶
泳道图设计
并发活动建模
▶
状态机图
状态转换原理
复合状态解析
有限状态机实现
▶
交互型图表
▶
时序图
对象生命周期
同步异步消息
交互片段组合
发布时间:
2025-03-25 13:48
↑
☰
# 有限状态机实现 有限状态机(Finite State Machine,FSM)是一种强大的设计模式,用于管理复杂的状态转换逻辑。本文将详细介绍如何实现一个完整的状态机系统,包括状态模式、状态转换和事件处理机制。 ## 状态机的核心组件 ### 1. 基本结构 ```mermaid classDiagram class State { +enter() +exit() +handleEvent(event) } class Context { -currentState +setState(state) +handleEvent(event) } class ConcreteState { +enter() +exit() +handleEvent(event) } State <|-- ConcreteState Context o-- State ``` 组件说明: - State:状态接口 - Context:状态机上下文 - ConcreteState:具体状态实现 ## 状态模式实现 ### 1. 状态接口 ```python from abc import ABC, abstractmethod class State(ABC): @abstractmethod def enter(self): pass @abstractmethod def exit(self): pass @abstractmethod def handle_event(self, event): pass ``` ### 2. 状态机上下文 ```python class StateMachine: def __init__(self, initial_state): self.current_state = initial_state self.current_state.enter() def transition_to(self, new_state): self.current_state.exit() self.current_state = new_state self.current_state.enter() def handle_event(self, event): self.current_state.handle_event(event) ``` ## 状态转换实现 ### 1. 转换表 ```mermaid stateDiagram-v2 state 订单状态机 { [*] --> 待支付 待支付 --> 已支付 : 支付成功 待支付 --> 已取消 : 超时/取消 已支付 --> 已发货 : 发货 已发货 --> 已完成 : 确认收货 已完成 --> [*] 已取消 --> [*] } ``` 实现代码: ```python class OrderState: def __init__(self): self.transitions = { 'PENDING': { 'PAY': 'PAID', 'CANCEL': 'CANCELLED' }, 'PAID': { 'SHIP': 'SHIPPED' }, 'SHIPPED': { 'CONFIRM': 'COMPLETED' } } ``` ### 2. 事件处理 ```python class OrderStateMachine: def handle_event(self, event): if event.type in self.transitions[self.current_state]: next_state = self.transitions[self.current_state][event.type] self.transition_to(next_state) return True return False ``` ## 实际应用示例 ### 1. 游戏角色状态机 ```mermaid stateDiagram-v2 state 角色状态机 { [*] --> 待机 state 战斗 { 普通攻击 --> 技能施放 技能施放 --> 普通攻击 } 待机 --> 移动 : 按下方向键 移动 --> 待机 : 松开方向键 待机 --> 战斗 : 按下攻击键 战斗 --> 待机 : 战斗结束 } ``` 实现代码: ```python class PlayerState(State): def __init__(self, player): self.player = player class IdleState(PlayerState): def enter(self): self.player.animation.play('idle') def handle_event(self, event): if event.type == 'MOVE_START': return MoveState(self.player) elif event.type == 'ATTACK': return CombatState(self.player) return self class Player: def __init__(self): self.state_machine = StateMachine(IdleState(self)) def handle_input(self, input_event): self.state_machine.handle_event(input_event) ``` ### 2. 网络连接状态机 ```mermaid stateDiagram-v2 state 连接状态机 { [*] --> 已断开 已断开 --> 连接中 : 连接请求 连接中 --> 已连接 : 连接成功 连接中 --> 已断开 : 连接失败 已连接 --> 已断开 : 断开连接 state 已连接 { 空闲 --> 发送数据 发送数据 --> 空闲 } } ``` ## 高级特性实现 ### 1. 状态历史 ```python class StateMachine: def __init__(self): self.history = [] def transition_to(self, new_state): self.history.append(self.current_state) super().transition_to(new_state) def undo(self): if self.history: previous_state = self.history.pop() self.transition_to(previous_state) ``` ### 2. 状态观察者 ```python class StateObserver: def on_state_changed(self, old_state, new_state): pass class StateMachine: def __init__(self): self.observers = [] def add_observer(self, observer): self.observers.append(observer) def transition_to(self, new_state): old_state = self.current_state super().transition_to(new_state) for observer in self.observers: observer.on_state_changed(old_state, new_state) ``` ## 最佳实践 ### 1. 状态设计 - 状态职责单一 - 状态间低耦合 - 状态转换明确 ### 2. 事件处理 - 事件类型枚举 - 事件参数封装 - 错误处理机制 ### 3. 性能优化 - 状态缓存 - 转换表优化 - 内存管理 ## 常见问题 1. **状态爆炸** - 问题:状态数量剧增 - 解决:使用组合状态、状态复用 2. **转换冲突** - 问题:多个转换条件同时满足 - 解决:优先级机制、互斥条件 3. **状态持久化** - 问题:状态需要序列化存储 - 解决:状态序列化接口、快照模式 ## 总结 有限状态机是一种强大的设计模式,通过: - 清晰的状态定义 - 可控的转换逻辑 - 灵活的事件处理 帮助我们管理复杂的状态转换系统。掌握FSM的实现技巧,对于开发可维护的状态驱动系统至关重要。