10.4.7 活动图
活动图描述一个过程如何一步一步执行。它可以展示控制流和数据流,适合功能建模、业务流程建模和用例内部流程分析。
它看起来像流程图,但比普通流程图更适合面向对象建模,尤其能表达并发活动。
活动图表达什么
活动图关注的是“动作如何流转”,不是“对象处于什么状态”。
| 适合用活动图的问题 | 不适合混成活动图的问题 |
|---|---|
| 用户下单流程如何走 | 订单有哪些状态 |
| 审批流程有哪些分支 | 审批单从待审到通过如何迁移 |
| 多个任务能否并发执行 | 某个类有哪些属性和方法 |
| 一个用例内部有哪些步骤 | 系统部署在哪些服务器上 |
基本组成
| 元素 | 含义 | 图形线索 |
|---|---|---|
| 初始节点 | 流程开始 | 实心圆 |
| 活动/动作 | 一个具体步骤 | 圆角矩形 |
| 流 | 活动之间的流向 | 箭头线 |
| 分支 | 根据条件选择路径 | 菱形 |
| 监护条件 | 分支路径上的判断条件 | [条件] |
| 并发分岔 | 一条流分成多条并行流 | 粗实线 |
| 并发汇合 | 多条并行流汇合 | 粗实线 |
| 终止节点 | 流程结束 | 终止圆 |
mermaid
flowchart TB
Start((开始)) --> Login["提交登录信息"]
Login --> Check{"账号有效?"}
Check -- "[否]" --> Fail["提示错误"]
Fail --> End((结束))
Check -- "[是]" --> Fork["并发分岔"]
Fork --> LoadProfile["加载用户资料"]
Fork --> LoadPermission["加载权限"]
LoadProfile --> Join["并发汇合"]
LoadPermission --> Join
Join --> Home["进入首页"]
Home --> End图中菱形表示普通条件分支,粗实线表示可以并发执行的分岔与汇合。课程中特别强调:活动图能够表达并发过程。
分支与并发不要混淆
| 对比项 | 条件分支 | 并发分岔 |
|---|---|---|
| 图形 | 菱形 | 粗实线 |
| 语义 | 多条路径中选择一条 | 多条路径可以同时进行 |
| 路径标注 | 常有 [yes]、[no] 或监护条件 | 通常不表示互斥选择 |
| 例子 | 支付成功/支付失败 | 同时发送短信和生成通知 |
监护条件是路径能否被选择的条件,通常写在流上。例如 [库存充足]、[余额不足]。
泳道活动图
如果要说明每个活动由谁发起或负责,可以把活动图按责任主体划分成泳道。
| 泳道 | 可能包含的活动 |
|---|---|
| 客户 | 提交订单、确认收货 |
| 系统 | 校验库存、生成订单、发送通知 |
| 供应商 | 发货、更新物流 |
泳道的价值在于把流程责任看清楚:同一个流程可能跨越客户、系统、供应商多个参与方,单纯从上到下画步骤容易丢掉“谁做这一步”。
活动图与状态图的区别
| 对比项 | 活动图 | 状态图 |
|---|---|---|
| 关注点 | 活动步骤、控制流、数据流 | 对象状态、事件、迁移 |
| 节点含义 | 动作或活动 | 状态 |
| 箭头含义 | 流向 | 状态迁移 |
| 典型题干 | 业务流程、活动流、并发分支 | 状态变化、事件触发、状态机 |
看到“活动流”“完成任务所需进行的活动”,选活动图;看到“对象状态转换”,选状态图。
例题
描述业务处理流程、条件分支和并发活动,常使用:
活动图中,分支路径上的 `[余额充足]` 这类判断条件通常称为:
自查要点
- 活动图为什么比普通流程图更适合表达并发?
- 菱形分支和粗实线分岔有什么区别?
- 监护条件通常写在哪里?
- 泳道活动图解决的是什么问题?