交互图与状态图
系统讲解UML中三种重要的动态行为图:时序图(按时间顺序描述对象交互)、通信图(按组织结构描述对象交互)和状态图(描述对象状态变化)。
🎯学习目标
- 理解交互图的概念,掌握时序图和通信图的元素、关系与绘制方法;
- 掌握时序图中的对象、生命线、消息、激活、组合片段等核心概念;
- 掌握通信图中的对象、链、消息编号与绘制方法;
- 理解状态图的概念,掌握状态、转移、事件、动作等元素;
- 能够根据需求选择合适的图进行建模,并能阅读和绘制这三种图。
1时序图(Sequence Diagram)⭐
时序图(Sequence Diagram)是UML中最重要的交互图之一,它按照时间顺序描述对象之间的交互。时序图强调消息的时间顺序,适合展示用例的实现流程。
💡 通俗理解:什么是时序图?
想象你在看一场话剧:
- 对象就像舞台上的演员(如:用户、登录界面、数据库)
- 生命线就像演员头顶的虚线,表示演员"活着"的时间段
- 消息就像演员之间的对话,按时间顺序从上到下排列
- 激活就像演员正在表演的那段时间(高亮的矩形条)
时序图就是把软件运行过程"可视化"成一场有序的对话表演。
时序图的四大组成元素
图1 · 时序图核心元素:对象(矩形)、生命线(虚线)、激活(高亮矩形)、消息(箭头)、组合片段(虚线框)
👤
对象与生命线
Object & Lifeline对象是类的实例,用"对象名:类名"表示(可省略对象名或类名)。生命线是对象下方的虚线,表示对象存在的时间段。对象可以在交互过程中创建(«create»)或销毁(×)。
💬
消息类型
Message Types同步消息(实线实心箭头):发送方等待接收方处理完毕。异步消息(实线开放箭头):发送方不等待。返回消息(虚线开放箭头):表示控制流返回。自调用:对象调用自己的方法。
⚡
激活与执行
Activation激活(也叫执行发生)是生命线上的高亮矩形条,表示对象正在执行某个操作。激活条的长度表示执行时间。嵌套的激活条表示递归调用。
📦
组合片段
Combined Fragment用虚线矩形框表示,内部包含操作符和交互。常见操作符:alt(条件分支,类似if-else)、opt(可选,类似if)、loop(循环)、par(并行)等。
绘制时序图的步骤
建模步骤
- 识别参与交互的对象:从用例描述或类图中找出参与交互的类/对象。
- 确定对象的生命周期:哪些对象需要创建?何时销毁?
- 按时间顺序排列消息:从上到下表示时间顺序,先发生的在上面。
- 添加激活和返回消息:明确每个操作的执行时间段和返回值。
- 使用组合片段处理复杂逻辑:条件分支、循环、并行等。
⭐ 时序图示例:用户登录过程
场景:用户输入用户名和密码,系统验证后返回结果。
- 对象:用户界面(UI)、认证控制器(AuthController)、用户数据库(UserDB)
- 消息流:
1. 用户 → UI:输入用户名和密码
2. UI → AuthController:login(username, password)
3. AuthController → UserDB:queryUser(username)
4. UserDB → AuthController:返回用户信息
5. AuthController → AuthController:验证密码
6. AuthController → UI:返回登录结果
7. UI → 用户:显示成功/失败
2通信图(Communication Diagram)
通信图(Communication Diagram)是UML中另一种交互图,它强调对象之间的组织结构和链接关系。通信图以前也称为"协作图"(Collaboration Diagram)。
💡 通俗理解:通信图与时序图的区别
如果把软件运行比作一场对话:
- 时序图像剧本,按时间顺序写好每句台词(消息)的先后顺序
- 通信图像舞台布局图,显示演员(对象)站在哪里、谁和谁说话,但台词的顺序用编号表示
两者表达的信息相同,但侧重点不同:时序图强调"什么时候",通信图强调"谁和谁"。
通信图的组成元素
图2 · 通信图核心元素:对象(矩形)、链(直线)、消息(带编号的箭头)、多对象(虚线矩形)
🔗
链(Link)
Link链是关联关系的实例,表示对象之间存在通信路径。用实线表示,可以有方向性。链上可以附加消息。
🔢
消息编号
Message Numbering消息用数字编号表示顺序(如1, 2, 3)。嵌套消息用小数点表示(如1.1, 1.2)。编号反映了消息的嵌套层次和执行顺序。
👥
多对象
Multi-object表示一组对象的集合,用虚线矩形表示,对象名后加"*"。例如"订单项*:OrderItem"表示多个订单项对象。
📋
消息标签
Message Label消息标签格式:[条件] 序号: 返回值 := 操作名(参数)。例如:[已登录] 2.1: user := getUser(id)。
通信图与时序图的对比
| 特性 | 时序图 | 通信图 |
|---|---|---|
| 强调重点 | 消息的时间顺序 | 对象之间的组织结构 |
| 布局方式 | 对象在顶部,生命线垂直向下 | 对象自由布局,链连接 |
| 消息顺序 | 由垂直位置隐含表示 | 由编号显式表示 |
| 适用场景 | 展示详细的交互流程 | 展示对象间的结构关系 |
| 可读性 | 对于复杂流程更直观 | 对于结构关系更清晰 |
⭐ 通信图示例:用户登录过程(与时序图相同场景)
同样的登录场景,用通信图表示:
- 对象:用户界面(UI)、认证控制器(AuthController)、用户数据库(UserDB)
- 链:UI ↔ AuthController ↔ UserDB
- 消息:
1: login(username, password) [UI → AuthController]
1.1: queryUser(username) [AuthController → UserDB]
1.1.1: 返回用户信息 [UserDB → AuthController]
1.2: 验证密码 [AuthController → AuthController]
1.3: 返回登录结果 [AuthController → UI]
2: 显示结果 [UI → 用户]
3状态图(State Diagram)⭐
状态图(State Diagram)描述对象在其生命周期内所经历的状态序列,以及对象如何响应外部事件而发生状态变化。状态图也称为"状态机图"(State Machine Diagram)。
💡 通俗理解:什么是状态图?
想象一个"订单"对象的一生:
- 状态就像人生的不同阶段:待支付、已支付、已发货、已完成、已取消
- 事件就像触发状态变化的事情:用户支付、商家发货、用户确认收货
- 转移就像从一个阶段到另一个阶段的过程:待支付 →(支付成功)→ 已支付
- 动作就像状态变化时要做的事情:发送确认邮件、更新库存
状态图就是描述一个对象"一生"中经历了哪些状态、什么事件触发了变化、变化时做了什么。
状态图的组成元素
图3 · 状态图核心元素:初始状态(实心圆)、状态(圆角矩形)、转移(箭头)、复合状态(虚线框)、历史状态(H圆)、终止状态(同心圆)
⭕
状态(State)
State对象生命周期中的某个条件或状况,在此期间对象满足某些条件、执行某些活动或等待某些事件。状态用圆角矩形表示,可以包含:进入动作(entry/)、活动(do/)、退出动作(exit/)。
➡️
转移(Transition)
Transition两个状态之间的关系,表示对象在第一个状态中执行一定的动作,并在某个事件发生或某个条件满足时进入第二个状态。格式:事件[条件]/动作。
⚡
事件(Event)
Event触发状态转移的事情。常见类型:信号事件(接收信号)、调用事件(调用操作)、时间事件(after(时间))、变化事件(when(条件))。
📦
复合状态
Composite State包含子状态机的状态。可以包含顺序子状态(串行)或并发子状态(并行)。复合状态可以简化复杂的状态图。
状态图的绘制步骤
建模步骤
- 识别需要建模的对象:选择状态复杂的类(如订单、用户会话、设备控制等)。
- 确定对象的可能状态:列出对象所有可能的状态(如:待处理、处理中、已完成)。
- 识别触发状态转移的事件:什么事件会导致状态变化?
- 确定转移条件和动作:转移是否有条件?转移时执行什么动作?
- 处理复杂状态:使用复合状态、历史状态等简化图。
⭐ 状态图示例:订单状态
场景:电商订单的状态变化过程。
- 状态:待支付、已支付、已发货、已完成、已取消
- 转移:
● → 待支付(创建订单)
待支付 → 已支付(支付成功)
待支付 → 已取消(超时未支付/用户取消)
已支付 → 已发货(商家发货)
已发货 → 已完成(用户确认收货/自动确认)
已发货 → 已支付(用户退货退款) - 动作:支付成功时发送确认邮件,发货时更新物流信息
4三种图的对比与选择
时序图、通信图和状态图都是UML中描述动态行为的重要图,但它们各有侧重:
| 图类型 | 主要用途 | 强调重点 | 适用场景 |
|---|---|---|---|
| 时序图 | 描述对象间的交互 | 消息的时间顺序 | 展示用例实现、方法调用流程 |
| 通信图 | 描述对象间的交互 | 对象间的组织结构 | 展示对象关系、协作模式 |
| 状态图 | 单个对象的行为 | 状态变化 | 状态复杂的对象(订单、设备、协议) |
💡 如何选择?
- 要展示多个对象之间的交互流程?→ 用时序图或通信图
- 要强调时间顺序?→ 用时序图
- 要强调对象结构关系?→ 用通信图
- 要描述单个对象的状态变化?→ 用状态图
- 时序图和通信图是语义等价的,可以相互转换
⭐重点例题
例题1:画"用户登录"时序图
场景描述:用户输入用户名和密码,系统验证后显示登录结果。
分析:
- 对象:用户界面(UI)、认证控制器(AuthController)、用户数据库(UserDB)
- 消息流:
1. 用户 → UI:输入用户名和密码
2. UI → AuthController:login(username, password)
3. AuthController → UserDB:queryUser(username)
4. UserDB → AuthController:返回用户信息
5. AuthController → AuthController:验证密码
6. AuthController → UI:返回登录结果
7. UI → 用户:显示成功/失败
例题2:画"订单"状态图
场景描述:电商订单的状态变化过程。
分析:
- 状态:待支付、已支付、已发货、已完成、已取消
- 转移:
● → 待支付(创建订单)
待支付 → 已支付(支付成功)
待支付 → 已取消(超时未支付/用户取消)
已支付 → 已发货(商家发货)
已发货 → 已完成(用户确认收货)
已发货 → 已支付(退货退款) - 动作:支付成功时发送确认邮件,发货时更新物流信息
例题3:时序图与通信图的转换
场景描述:将上述"用户登录"时序图转换为通信图。
分析:
- 对象:UI、AuthController、UserDB
- 链:UI ↔ AuthController ↔ UserDB
- 消息编号:
1: login(username, password) [UI → AuthController]
1.1: queryUser(username) [AuthController → UserDB]
1.1.1: 返回用户信息 [UserDB → AuthController]
1.2: 验证密码 [AuthController → AuthController]
1.3: 返回登录结果 [AuthController → UI]
2: 显示结果 [UI → 用户]
🎯自测(点击展开)
时序图和通信图的主要区别是什么?
时序图强调消息的时间顺序,按时间从上到下排列;通信图强调对象间的组织结构,用编号表示消息顺序。两者语义等价,可以相互转换。
时序图中"激活"表示什么?
激活(也叫执行发生)是生命线上的高亮矩形条,表示对象正在执行某个操作。激活条的长度表示执行时间,嵌套的激活条表示递归调用。
状态图中"转移"的格式是什么?
转移的格式是事件[条件]/动作。例如:"支付成功[余额充足]/扣款并发送确认邮件"。事件触发转移,条件决定是否执行,动作是转移时执行的操作。
什么情况下使用状态图?
当对象的状态变化复杂、需要明确记录对象生命周期时使用状态图。典型场景:订单状态、设备控制、协议状态、工作流状态等。
通信图中消息编号"1.1.2"表示什么?
表示第1个消息的第1个子消息的第2个子消息。编号反映了消息的嵌套层次和执行顺序,数字越大嵌套越深。
时序图中如何表示对象的创建和销毁?
创建:用«create»构造型和箭头指向新对象。销毁:在生命线上画×符号。创建的对象生命线从创建消息开始,销毁的对象生命线在销毁处结束。
📝强化题库
选择题点选即时判分;填空题输入后"检查"或"显示答案"。
已答 0/0答对 0正确率 —
已答 0/0答对 0