Skip to content
难度基础(★)
建议时长45分钟

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

课程提醒:硬币器/硬币与饮料存储仓/饮料这两组位置可以根据图中整体-部分关系成对互换,但整体位置不能填到部分位置。

英文词汇的使用

如果题目明确给出英文词汇,类名通常要用英文填写。常见形式是表格中给出英文名与中文说明,或者通信图对象写成 对象名:类名

原则:题目要求“用题目给出的英文词汇”时,不要用中文翻译自行填写。

做题步骤

  1. 找题干列出的状态名,不自己造状态。
  2. 按对象生命周期排序状态,不按空号顺序猜。
  3. 从主要事件流提取正常迁移,从备选事件流提取回退或异常迁移。
  4. 从名词和整体-部分关系找类名。
  5. 成对检查整体与部分是否放反。
  6. 如果题目要求英文,按原文英文填写。

例题

单选
状态图主要用于描述:
单选
自动售货机在没有用户操作、等待下一次交易时,最适合称为:

自查要点

  1. 为什么空闲状态通常早于准备服务状态?
  2. 状态迁移线上的事件、条件、动作分别从哪里找?
  3. 类图中整体-部分关系如何帮助填硬币器、硬币、饮料存储仓、饮料?
  4. 为什么状态编号不能作为状态顺序的唯一依据?