11.3.2 例题2:状态图与类图
状态图与类图组合题常把一个对象的生命周期扣掉若干状态名和迁移条件,再让你补类图中的类名。课程例题是自动售货机系统,适合用来练“状态顺序”和“整体-部分类名定位”。
题目结构
例题给出了自动售货机购买饮料的用例规约、状态图和类图。填空大致分三类:
| 填空内容 | 解题来源 |
|---|---|
| 状态名 | 题干明确列出的四个状态 |
| 迁移事件/条件/动作 | 用例规约的主要事件流和备选事件流 |
| 类名 | 题干名词、英文词汇、整体-部分关系 |
状态图的四个状态题干已经给出:空闲、准备服务、可购买、饮料出售。真正要判断的是它们在图中的顺序和位置。
空闲与准备服务的区别
课程中特别提醒,这两个状态容易填反。
| 状态 | 含义 | 类比理解 |
|---|---|---|
| 空闲状态 | 没有用户操作,机器等待下一次交易 | 屏幕待机或广告播放 |
| 准备服务状态 | 用户开始选择或投入硬币,系统被激活但还不能购买 | 已唤醒,等待条件满足 |
| 可购买状态 | 硬币足够、饮料数量也可满足 | 可以出货 |
| 饮料出售状态 | 机器正在推出饮料、找零、完成交易 | 出货并收尾 |
所以初始进入的第一个状态应是空闲。用户选择饮料、投币后,进入准备服务;硬币足够且饮料足够后,才进入可购买;推出饮料后进入饮料出售。
mermaid
stateDiagram-v2
[*] --> 空闲
空闲 --> 准备服务: 选择饮料/投入硬币
准备服务 --> 准备服务: 硬币不足/提示继续投币
准备服务 --> 可购买: 硬币足够
可购买 --> 准备服务: 饮料不足/提示重新选择
可购买 --> 饮料出售: 饮料足够/推出饮料
饮料出售 --> 空闲: 找零并清空硬币器具体考试图上的编号可能不是按状态顺序排列,例如下一个状态可能标成 S4 而不是 S3。不要按编号猜,要按状态迁移逻辑填。
状态迁移怎么从规约里找
用例规约一般包含主要事件流和备选事件流。状态图迁移线上的信息通常来自这些步骤。
| 规约描述 | 状态图信息 |
|---|---|
| 选择饮料和数量,投入硬币 | 触发从空闲到准备服务 |
| 检查硬币是否足够 | 准备服务到可购买的条件 |
| 若硬币不足,提示并返回投币 | 准备服务自循环或返回准备服务 |
| 检查饮料数量是否足够 | 可购买到饮料出售的条件 |
| 若饮料不足,提示重新选择 | 可购买返回准备服务 |
| 推出饮料并返回找零 | 饮料出售状态的动作 |
| 一次购买结束后清空硬币器 | 交易收尾动作,回到空闲 |
状态迁移常用结构:
text
事件 [条件] / 动作填空时如果只要求事件名,就写触发动作;如果要求条件,就写“硬币足够”“饮料不足”等;如果要求动作,就写“推出饮料”“返回找零”“清空硬币器”等。
类图填空:整体与部分
自动售货机类图中,题干会出现几个高价值名词:
| 题干名词 | 类图角色 |
|---|---|
| 自动售货机 | 最大整体 |
| 硬币器 | 自动售货机的一部分,保存硬币 |
| 硬币 | 硬币器中的部分 |
| 饮料存储仓 | 自动售货机的一部分,保存饮料 |
| 饮料 | 饮料存储仓中的部分 |
类图中如果出现两组整体-部分关系,可以成组填写:
mermaid
classDiagram
class VendingMachine
class CoinCollector
class Coin
class DrinkStore
class Drink
VendingMachine o-- CoinCollector
VendingMachine o-- DrinkStore
CoinCollector o-- Coin
DrinkStore o-- Drink课程提醒:硬币器/硬币与饮料存储仓/饮料这两组位置可以根据图中整体-部分关系成对互换,但整体位置不能填到部分位置。
英文词汇的使用
如果题目明确给出英文词汇,类名通常要用英文填写。常见形式是表格中给出英文名与中文说明,或者通信图对象写成 对象名:类名。
原则:题目要求“用题目给出的英文词汇”时,不要用中文翻译自行填写。
做题步骤
- 找题干列出的状态名,不自己造状态。
- 按对象生命周期排序状态,不按空号顺序猜。
- 从主要事件流提取正常迁移,从备选事件流提取回退或异常迁移。
- 从名词和整体-部分关系找类名。
- 成对检查整体与部分是否放反。
- 如果题目要求英文,按原文英文填写。
例题
状态图主要用于描述:
自动售货机在没有用户操作、等待下一次交易时,最适合称为:
自查要点
- 为什么空闲状态通常早于准备服务状态?
- 状态迁移线上的事件、条件、动作分别从哪里找?
- 类图中整体-部分关系如何帮助填硬币器、硬币、饮料存储仓、饮料?
- 为什么状态编号不能作为状态顺序的唯一依据?