🎓 总站 🏠 本课目录 01 概述 02 软件过程 03 需求工程 04 系统建模 05 概要设计 06 报告与高可信 07 交互与状态图 08 详细设计 09 AOP 10 测试
软件系统综合课程设计 · 第7章

交互图与状态图

系统讲解UML中三种重要的动态行为图:时序图(按时间顺序描述对象交互)、通信图(按组织结构描述对象交互)和状态图(描述对象状态变化)。

📚 学习进度
0%

🎯学习目标

  • 理解交互图的概念,掌握时序图和通信图的元素、关系与绘制方法;
  • 掌握时序图中的对象、生命线、消息、激活、组合片段等核心概念;
  • 掌握通信图中的对象、链、消息编号与绘制方法;
  • 理解状态图的概念,掌握状态、转移、事件、动作等元素;
  • 能够根据需求选择合适的图进行建模,并能阅读和绘制这三种图。

1时序图(Sequence Diagram)⭐

时序图(Sequence Diagram)是UML中最重要的交互图之一,它按照时间顺序描述对象之间的交互。时序图强调消息的时间顺序,适合展示用例的实现流程。

💡 通俗理解:什么是时序图?

想象你在看一场话剧:

  • 对象就像舞台上的演员(如:用户、登录界面、数据库)
  • 生命线就像演员头顶的虚线,表示演员"活着"的时间段
  • 消息就像演员之间的对话,按时间顺序从上到下排列
  • 激活就像演员正在表演的那段时间(高亮的矩形条)

时序图就是把软件运行过程"可视化"成一场有序的对话表演。

时序图的四大组成元素

对象:类名 生命线 激活 同步消息 异步消息 返回消息 对象2:类 alt [条件] [else] 自调用 新对象:类 «create»
图1 · 时序图核心元素:对象(矩形)、生命线(虚线)、激活(高亮矩形)、消息(箭头)、组合片段(虚线框)
👤

对象与生命线

Object & Lifeline
对象是类的实例,用"对象名:类名"表示(可省略对象名或类名)。生命线是对象下方的虚线,表示对象存在的时间段。对象可以在交互过程中创建(«create»)或销毁(×)。
💬

消息类型

Message Types
同步消息(实线实心箭头):发送方等待接收方处理完毕。异步消息(实线开放箭头):发送方不等待。返回消息(虚线开放箭头):表示控制流返回。自调用:对象调用自己的方法。

激活与执行

Activation
激活(也叫执行发生)是生命线上的高亮矩形条,表示对象正在执行某个操作。激活条的长度表示执行时间。嵌套的激活条表示递归调用。
📦

组合片段

Combined Fragment
用虚线矩形框表示,内部包含操作符和交互。常见操作符:alt(条件分支,类似if-else)、opt(可选,类似if)、loop(循环)、par(并行)等。

绘制时序图的步骤

建模步骤
  1. 识别参与交互的对象:从用例描述或类图中找出参与交互的类/对象。
  2. 确定对象的生命周期:哪些对象需要创建?何时销毁?
  3. 按时间顺序排列消息:从上到下表示时间顺序,先发生的在上面。
  4. 添加激活和返回消息:明确每个操作的执行时间段和返回值。
  5. 使用组合片段处理复杂逻辑:条件分支、循环、并行等。
⭐ 时序图示例:用户登录过程

场景:用户输入用户名和密码,系统验证后返回结果。

  • 对象:用户界面(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)。

💡 通俗理解:通信图与时序图的区别

如果把软件运行比作一场对话:

  • 时序图像剧本,按时间顺序写好每句台词(消息)的先后顺序
  • 通信图像舞台布局图,显示演员(对象)站在哪里、谁和谁说话,但台词的顺序用编号表示

两者表达的信息相同,但侧重点不同:时序图强调"什么时候",通信图强调"谁和谁"。

通信图的组成元素

对象A:类 对象B:类 对象C:类 1: message1() 2: message2() 1.1: subMessage() 对象D:类 3: message3() 对象E*:类 多对象 消息编号规则: 1, 2, 3... 顺序 1.1, 1.2... 嵌套
图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)。

💡 通俗理解:什么是状态图?

想象一个"订单"对象的一生:

  • 状态就像人生的不同阶段:待支付、已支付、已发货、已完成、已取消
  • 事件就像触发状态变化的事情:用户支付、商家发货、用户确认收货
  • 转移就像从一个阶段到另一个阶段的过程:待支付 →(支付成功)→ 已支付
  • 动作就像状态变化时要做的事情:发送确认邮件、更新库存

状态图就是描述一个对象"一生"中经历了哪些状态、什么事件触发了变化、变化时做了什么。

状态图的组成元素

初始状态 状态1 事件1 状态2 事件2[条件] / 动作 复合状态 子状态1 子状态2 H 历史状态 终止状态 自转移 entry/进入动作 do/活动 exit/退出动作
图3 · 状态图核心元素:初始状态(实心圆)、状态(圆角矩形)、转移(箭头)、复合状态(虚线框)、历史状态(H圆)、终止状态(同心圆)

状态(State)

State
对象生命周期中的某个条件或状况,在此期间对象满足某些条件、执行某些活动或等待某些事件。状态用圆角矩形表示,可以包含:进入动作(entry/)、活动(do/)、退出动作(exit/)。
➡️

转移(Transition)

Transition
两个状态之间的关系,表示对象在第一个状态中执行一定的动作,并在某个事件发生或某个条件满足时进入第二个状态。格式:事件[条件]/动作

事件(Event)

Event
触发状态转移的事情。常见类型:信号事件(接收信号)、调用事件(调用操作)、时间事件(after(时间))、变化事件(when(条件))。
📦

复合状态

Composite State
包含子状态机的状态。可以包含顺序子状态(串行)或并发子状态(并行)。复合状态可以简化复杂的状态图。

状态图的绘制步骤

建模步骤
  1. 识别需要建模的对象:选择状态复杂的类(如订单、用户会话、设备控制等)。
  2. 确定对象的可能状态:列出对象所有可能的状态(如:待处理、处理中、已完成)。
  3. 识别触发状态转移的事件:什么事件会导致状态变化?
  4. 确定转移条件和动作:转移是否有条件?转移时执行什么动作?
  5. 处理复杂状态:使用复合状态、历史状态等简化图。
⭐ 状态图示例:订单状态

场景:电商订单的状态变化过程。

  • 状态:待支付、已支付、已发货、已完成、已取消
  • 转移
    ● → 待支付(创建订单)
    待支付 → 已支付(支付成功)
    待支付 → 已取消(超时未支付/用户取消)
    已支付 → 已发货(商家发货)
    已发货 → 已完成(用户确认收货/自动确认)
    已发货 → 已支付(用户退货退款)
  • 动作:支付成功时发送确认邮件,发货时更新物流信息

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