十一. UML 建模
UML 建模部分是下午场考试中第三个题目,分值 15 分。先介绍一下这类题目的考查形式。
1. 考察形式
(1)类图与对象图
- 填类名,方法名,属性名
- 填关系
- 填多重度
UML 中四种基本关系:
依赖关系:
泛化关系:
关联关系:
聚合
组合
实现关系:
(2)用例图
- 参与者
- 用例名
- 关系
- 细化用例描述
用例图中的三种关系:
包含(必选):
扩展(可选):
泛化(必选):
细化用例描述:
用例规约描述如下。
参与者:顾客。
主要事件流:
- 顾客选择需要购买的饮料和数量,投入硬币;
- 自动售货机检查顾客是否投入足够的硬币;;
- 自动售货机检查饮料存储仓中所选购的饮料是否足够;
- 自动售货机推出饮料;
- 自动售货机返回找零。
备选事件流:
2a. 投入的硬币不足,则给出提示并退回到1;
3a. 若所选购的饮料数量不足,则给出提示并退回到1。
(3)通信图
- 对象名
- 消息
(4)顺序图
- 对象名
- 消息
- 生命周期
其中,实线代表调用消息,虚线代表返回消息, 实心箭头表示同步消息,空心箭头表示异步消息。
(5)状态图
- 状态名
- 触发事件、监护条件、动作
(6)活动图
- 活动名
- 开始、结束
- 并发分支、并发汇合
- 活动发起者
2. 例题
(1)例题 1
用例图与类图。
说明:
某出版社拟开发一个在线销售各种学术出版物的网上商店(ACShop),其主要的功能需求描述如下:
(1)ACShop 在线销售的学术出版物包括论文、学术报告或讲座资料等。
(2)ACShop 的客户分为两种:未注册客户和注册客户。
(3)未注册客户可以浏览或检索出版物,将出版物添加到购物车中。未注册客户进行注册操作后,成为 ACShop 注册客户。
(4)注册客户登录后,可将待购买的出版物添加到购物车中,并进行结账操作。结账操作的具体流程描述如下:
① 从预先填写的地址列表中选择一个作为本次交易的收获地址。如果没有地址信息,则可以添加新地址。
② 选择付款方式。ACShop 支持信用卡付款和银行转账两种方式。注册客户可以从预先填写的信用卡或银行账户中选择一个付款。若没有付款方式信息,则可以添加新付款方式。
③ 确认提交购物车中待购买的出版物后,ACShop 会自动生成与之对应的订单。
(5)管理员负责维护在线销售的出版物目录,包括添加新出版物或者更新在售出版物信息等操作。
采用面向对象方法分析并设计该网上商店 ACShop,分别得到下面所示的用例图和类图。
问题1:
根据说明中的描述,补充用例图中(1)~(4)对应的用例名。
问题2:
根据说明中的描述,补充类图中(1)~(7)对应的类名。
问题3:
根据说明中的描述,分别说明用例 “添加新地址” 和 “添加新付款方式” 会在何种情况下由用例图中的用例(3)和(4)扩展而来。
解析1:
首先明确,用例通常都是以名词+动词或动词+名词的形式存在。用例图中(3)和(4)用例都是扩展关系,并且在题干中指出,选择付款方式 …… 若没有付款方式信息,则可以添加新付款方式,所以可以得出(4)是选择付款方式,那么形式类似,(3)就是选择收获地址。(3)(4)和(2)属于包含关系,(2)同时也包含(1),那么继续分析题干,注册客户登录后,可将待购买的出版物添加到购物车中,并进行结账操作,因此注册客户进行结账操作后,可以将出版物添加到购物车,然后选择付款方式和收货地址。或者不先看(1),(2)处一定是结账,因为只有结账后才需要选择付款方式和收货地址,而将出版物添加到购物车后客户可以进行浏览或检索出版物。因此(2)是结账,(1)是将待购买出版物加入购物车。
(1)待购买出版物加入购物车 (2)结账 (3)选择收获地址 (4)选择付款方式
解析2:
类图中最明显的就是(3)~(6)类,明显的泛化关系,和付款方式类似,就是题干开头描述的ACShop 在线销售的学术出版物包括论文、学术报告或讲座资料等。因此(3)是学术出版物、(4)~(6)分别是论文、学术报告、讲座资料。接着看到(7),它与收货地址与付款方式具有依赖关系,因此(7)只能是订单。然后(2)与购物车和订单有聚合关系,并且购物车和订单是整体类,那么(2)只能是待购买的出版物,并且和学术出版物有依赖关系。最后看(1),也是稍难的一个类,它与 ACShop 有聚合关系,与购物车和客户平级,同时出版物与它也有聚合关系,那么只能是题干中最后提到的出版物目录。
(1)出版物目录(2)待购买的出版物(3)学术出版物(4)论文(5)学术报告(6)讲座资料(7)订单
解析3:
题目问什么情况下会扩展添加新地址和新付款方式,就是题干中描述的:
从预先填写的地址列表中选择一个作为本次交易的收获地址。如果没有地址信息,则可以添加新地址。
注册客户可以从预先填写的信用卡或银行账户中选择一个付款。若没有付款方式信息,则可以添加新付款方式。
(2)例题 2
状态图与类图。
说明:
某种出售罐装饮料的自动售货机(Vending Machine)的工作过程描述如下,
(1)顾客选择所需购买的饮料和数量。
(2)顾客从投币口向自动售货机中投入硬币(该机器只接收硬币)。硬币器收集投入的硬币并计算其对应的价值。如果所投入的硬币足够购买所需数量的饮料且饮料数量充足,则推出饮料,计算找零,顾客取走饮料和找回的硬币;如果投入的硬币不够或者所选购的饮料数量不足,则提示用户继续投入硬币或重新选择饮料及数量。
(3)一次购买结束后,将硬币器中的硬币移走(清空硬币器),等待下一次交易。自动售货机还设有一个退币按钮,用于退还顾客所投入的硬币。已经成功购买饮料的钱是不会被退回的。
采用面向对象方法分析和设计该自动售货机的软件系统,得到如下用例图。
其中,用例 “购买饮料” 的用例规约描述如下:
参与者:顾客。
主要事件流:
- 顾客选择需要购买的饮料和数量,投入硬币;
- 自动售货机检查顾客是否投入足够的硬币;;
- 自动售货机检查饮料存储仓中所选购的饮料是否足够;
- 自动售货机推出饮料;
- 自动售货机返回找零。
备选事件流:
2a. 投入的硬币不足,则给出提示并退回到1;
3a. 若所选购的饮料数量不足,则给出提示并退回到1。
根据用例 “购买饮料” 得到自动售货机的 4 个状态:空闲、准备服务、可购买、饮料出售,对应的状态图如下,所设计的类图如下:
问题1:
根据说明中的描述,使用说明中的术语,补充状态图中 S1~S4 对应的状态名。
问题2:
根据说明中的描述,使用说明中的术语,补充状态图中 E1~E4 对应的事件名。
问题3:
根据说明中的描述,使用说明中的术语,补充类图中 C1~C5 对应的类名。
解析1:
自动售货机共有空闲、准备服务、可购买、饮料出售四种状态。根据图示,S1 处应该是初始状态,即空闲状态,当客户选择饮料并投入硬币后,进入 S2。注意 S2 处的描述,硬币不足仍然返回 S2,对应备选事件流 2a,所以 S2 处应当是客户选择购买的饮料并投入硬币,S2 处应该是准备服务,S2 与 S4 之间存在循环情况,根据题干描述,S4 应该是可购买状态,购买完成后饮料出售,然后计算找零,所以 S3 是饮料出售状态。
S1:空闲 S2:准备服务 S3:饮料出售 S4:可购买
解析2:
S4 状态再次返回 S2 状态,对应了备选事件流 3a,2a 已经在 S2 处描述,所以 S4 再返回 S2,即 E1 就是所选购的饮料数量不足;那么 S2 成功进入 S4,即准备服务成功到可购买状态,就是硬币和饮料数量都是足够的,那么 E2 为选择需要购买的饮料和数量,投入硬币;接着自动售货机推出饮料,即 E3;然后计算找零并返回找零,E4 就是返回找零,但注意,题干中最后还描述一次购买结束后,将硬币器中的硬币移走(清空硬币器),所以 E4 还包括清空硬币器。
E1:所选购的饮料数量不足 E2:选择需要购买的饮料和数量,投入硬币
E3:自动售货机推出饮料 E4:返回找零/清空硬币器
解析3:
一个技巧是,通常在题干中注明的英文名词都是其中涉及到的类。顾客使用 C1,顾客只能使用自动售货机,所以 C1 就是自动售货机;C2 与 C4 以及 C3 与 C5 之间都存在一对多的关系,并且与自动售货机都是聚合关系,题干中符合这种描述的只有硬币器与硬币,饮料存储仓与饮料,因此按照对应关系填入即可。(找题干中的名词)
C1:自动售货机 C2:硬币器 C3:饮料存储仓 C4:硬币 C5:饮料
(3)例题 3
通信图与类图。
说明:
某高校图书馆欲建设一个图书馆管理系统,目前已经完成了需求分析阶段的工作。功能需求均使用用例进行描述,其中用例 “借书(Check out Books)” 的详细描述如下。
参与者:读者(Patron)
典型事件流:
- 输入读者ID;
- 确认该读者能够借阅图书,并记录读者ID;
- 输入所要借阅的图书ID;
- 根据图书目录中的图书ID确认该书可以借阅,计算归还时间,生成借阅记录;
- 通知读者图书归还时间。
重复步骤 3~5,直到读者结束借阅图书。
备选事件流:
2a. 若读者不能借阅图书,说明读者违反了图书馆的借书制度。
① 告知读者不能借阅,并说明拒绝借阅的原因;
② 本用例结束。
4a. 读者要借阅的书无法外借。
① 告知读者本书无法借阅;
② 回到步骤3。
采用面向对象方法开发该系统,得到下面所示类图和通信图。
问题1:
根据说明中的描述,以及上述通信图和类图,补充类图中 C1~C4 处对应的类名(类名使用两个图中给出的英文词汇)。
问题2:
根据说明中的描述,以及上述通信图和类图,补充通信图中 M1~M4 处对应的方法名(类名使用两个图中给出的英文词汇)。
问题3:
用例 “借书” 的备选事件流 4a 中,根据借书制度来判定读者能否借阅图书。若图书馆的借书制度会不断地扩充,并需要根据图书馆的实际运行情况来调整具体使用哪些制度。为满足这一要求,在原有类设计的基础上,可以采用何种设计模式?说明原因。
解析1:
首先明确两个图的含义,类图中给出了各个类之间的交互过程,上面是类名,下面是方法名;通信图中给出了各个类与方法作用的通信流程,并且箭头上方是方法,指向的是它所属的类,同时每个结点的表示,前面是对象名,后面是类名,如 b:Book,b 是对象名,Book 是类。题干中强调使用两个图中的英文词汇补充,因此两个图是可以互相借鉴补充的。
checkOut(bookID) 方法指向 CheckoutSessionController 类,因此 C4 是 CheckoutSessionController;checkOut(dd) 与 find(bookID) 方法均指向 Book 类,所以 C2 是 Book;此时通信图中还剩下两个类,分别是 Catalog 和 Patron,可以利用类中的方法去判断,Catalog 类中只有一个方法,因为箭头上方只有一个 M1,同理,Patron 类有两个方法,因此 C1 是 Patron,C3 就是 Catalog。
C1:Patron C2:Book C3:Catalog C4:CheckoutSessionController
解析2:
补充方法与问题1类似,去寻找类对应的方法,C2 是 Book 类,只剩下一个 circulates() 方法,因此 M3 是 circulates;M1 是 Catalog 类的唯一方法,即 getForCheckOut(id);M2 与 M4 是 Patron 类的两个方法,但注意区分先后顺序,根据题干的描述,应该是先判断读者是否能够借阅图书,然后才生成借阅记录,因此 M2 是 isFaculty,M4 是 recordBookLoan。
M1:getForCheckOut(id) M2:isFaculty() M3:circulates() M4:recordBookLoan(b:CheckoutSessionController)
解析3:
若图书馆的借书制度会不断地扩充,并需要根据图书馆的实际运行情况来调整具体使用哪些制度。根据题干描述,适合使用策略设计模式。策略设计模式定义了一系列算法,并将每个算法封装起来,而且使它们可以相互替换。策略模式让算法独立于使用它们的客户而变化。适用于需要在不同情况下使用不同的策略。
UML 建模部分的内容至此结束,后续如果有补充或修改会直接添加。