软件设计师 上午题 UML
软件设计师 上午题 UML
统一建模语言(Unified Modeling Language, UNL)是一种面向对象软件的标准化建模语言,其简单、统一且富有表达力,目前已经成为可视化建模语言事实上的工业标准。
UML的词汇表中包含了3种构造块:事物、关系和图。事物是对模型种最具有代表性的成分的抽象;关系将事物联系在了一起;图则聚集了相关的事物。下面我们将逐一了解这些构造块:
一、事物
UML中有四种事物:结构事物、行为事物、分组事物和注释事物:
1. 结构事物
结构事物通常是模型中的静态部分,用来描述概念或者物理元素,各种结构事物的图形化表示如下图所示:

2. 行为事物
行为事物通常是模型中的动态部分,用来描述跨越时间和空间的行为,其图形化表示如下图所示:

3. 分组事物
分组事物是UML模型中的组织部分,是一些由模型分解成的“盒子”。在应用中最主要的分组事物是包(Package),它能够将元素组织起来,绝大分事物都可以放进包内。包的图形化表示如下图所示:

4. 注释事物
这种事物的概念不难理解,而注解(Note)是其中比较重要的一种注释事物,其图形化表示如下图所示:

二、关系
UML当中有四种关系:依赖、关联、泛化和实现。
Ⅰ 概念了解
1. 依赖
在依赖关系中,一个事物(独立事物)发生变化会影响另一个事物(依赖事物)的语义,其图形化表示如下图所示:

当出现A --------> B
时,A是依赖事物
,B是独立事物
。
需要注意的是,依赖关系是单向的且是临时的,仅表示依赖事物需要独立事物,反之不成立。依赖可以体现在代码中的参数传递、局部变量、静态方法调用等场景。
2. 关联
当两个对象之间被连接起来,它们就构成了关联关系,如下图所示:

不难发现,在关联上还可以标注重复度(Multiplicity)和角色(Role),其中重复度指的就是参与关联的对象数量关系。
此外,还有两种特殊的关联,即聚集和组合,它们都描述的是整体和部分之间的结构关系,但是也略有不同:
i. 聚集:部分和整体的生命周期不一致,整体消失了,部分仍然存在。例如员工和公司。
ii. 组合:部分和整体的生命周期一致,整体消失了,部分也就消失了。例如部门和公司。

此外还有一种单向关联的情况,类似于A ——> B
,它和依赖关系A ---> B
的区别就在于前者不是临时的但后者是临时的。例如人 ——> 氧气
和人 ---> 食物
。
3. 泛化
即继承,它由特殊元素(子元素)指向一般元素(父元素)。用这种方法,子元素就可以共享父元素的结构和行为。例如猫泛化动物、狗泛化动物等。

4. 实现
实现是类元之间的语义关系,其中一个类元指定了另一个类元保证执行的契约。

Ⅱ 真题赏析

A,关联关系和泛化关系的区别在于,虽然它们都是特殊和一般之间的关系,但是关联关系是对象之间的关系,但是泛化是类之间的关系。

D,两个类之间的关联关系可以有多个,但不能有无限多个,都必须有对应的角色进行标识(如下图所示)。多个关联不必强行聚合成一个,聚合仅是一种特殊的关联。

三、图
在UML当中,图是一组元素的图形表示,我们一般情况下会将图画成事物和弧的连通图,而常见的图有以下几类:
注:由于这个板块的知识点比较零碎,不再单独设置真题赏析模块,真题将直接附在每个子模块后边。
Ⅰ 类图
类图是面向对象系统的建模中所建立的最常见的图,一般来说,一个类图中的内容即为类和类之间的依赖、泛化和关联关系。

- 2015年下半年:

B,继承和覆盖的区别在于前者是一种复用,而后者则是一种重新实现。在本题当中,显然在Car
类和Boat
类当中的+move()
函数并不是同一种函数,也就是说它们不可能都是对Transport
类中+move()
函数的继承,那么只能是为了实现多态而重新实现该函数了。
- 2020年下半年:

D,我们首先需要搞清楚什么是直接对象什么是非直接对象,直接对象是指直接从某个类中实例化的对象,而非直接对象则是指通过继承或者关联关系间接属于某个类的对象。对于本题中的A类,它是一个抽象类,抽象类是无法进行实例化的,也就是说A1和A2是A类的非直接对象。那么D选项中所谓的“A的直接对象”根本就不存在,错误。
Ⅱ 对象图
对象图展现的是某一时刻的一组对象以及它们之间的关系,描述了在类图中所建立的事物的实例的静态快照,其中一般包括的有对象和链。

Ⅲ 用例图
用例图是UML当中用于描述系统功能需求和用户交互的静态视图,其核心关注点在于参与者和系统功能之间的关系。

可以注意到的是,在用例图当中还包含了三种关系,这三种关系是用来描述用例和用例之间的交互逻辑的:
- 包含关系:表示一个用例必须调用另一个用例的功能,属于强依赖关系。
- 扩展关系:表示一个用例在特定条件下扩展另一个用例的功能,属于可选依赖。
- 泛化关系:表示用例之间的继承关系,子用例继承父用例的行为并扩展。
需要注意的是,包含关系和扩展关系再用例图当中的线条是一样的,区分它们的依据是虚线旁边的<<extend>>
或者<<include>>
。
Ⅳ 交互图
交互图是UML中用于描述对象间动态交互行为的图表,根据不同的目的又可划分为序列图和通信图。
1. 序列图
序列图是场景(Scenario)的图形化表示,描述了以时间顺序组织的对象之间的交互活动,如下图所示。

在序列图当中,我们一般把参加交互的对象放在图的上方(发起交互的对象在左,下级对象在右),然后把这些对象发送和接收的消息沿垂直方向按时间顺序从上到下放置。这样一来我们就得到了控制流随时间的可视化轨迹。
序列图当中还有两个特征:
- 对象生命线:在序列图当中用一根垂直的虚线来表示一个对象在一段时间内的存在。
- 控制焦点:在序列图当中用一个瘦高的矩形来表示一个对象执行一个动作所经历的时间段。
- 2013年下半年:

CB,首先要注意的是,在此题当中除了用虚线表示的evaluation()
函数是返回消息之外,其余的四种函数都是同步消息。而一条从A指向B的同步消息的本质是A要求B执行一个明确的操作,也就意味着如果对象A向对象B发送一条同步消息则对象B必须实现该方法。根据此原则不难发现,除了check()
函数需要Person
类来实现之外,其余的几种函数都需要Account
类来实现。
2. 通信图
通信图在早期的版本中也被称作协作图,强调的是参加交互的对象的组织关系,如下图所示:

通信图中有两个特性:
- 通信图中有路径:通信图当中用实线连接两个对象来表示对象之间存在的交互关联关系。
- 通信图中有顺序号:通信图中每个新消息前都有一个数字前缀,用于表示消息的时间顺序。
不难发现,序列图和通信图是同构的,它们之间可以互相转换。
Ⅴ 状态图
状态图展现了一个状态机,用来描述对象生命周期内状态变化,专注于展示对象如何响应事件并在不同状态间转换,如下图所示:

状态图当中包含了以下四个比较重要的概念:
- 状态:状态指的是对象在生命周期中的稳定条件,在特定时间段内保持属性值和行为不变。其中,●表示开始,⚪表示结束。如果一个状态当中还包含一个子状态,那么我们称这个状态为组合状态,或者为超状态。
- 活动:活动指的是对象在特定状态中持续执行的行为。
- 入口活动(entry):进入状态,立即执行。
- 执行活动(do):占有有限时间,可以中断。
- 出口活动(exit):退出状态,立即执行。
- 转换:转换指的是状态间的有向跳转,由事件触发并可能伴随条件和动作。此外,在转移过程中存在一个被称为“监护条件”的布尔值,用
[]
表示,如果存在监护条件,只有其为真值时才能触发转换。 - 事件:事件指的是触发状态转换的离散发生的事宜。
- 2013年上半年:

C,这道题的难点在于如何区分选项C和选项D。我们首先需要明白的是,当对象处于某种状态时,这个状态被称之为激活状态,只有从激活状态出发才能进行转换。对于C选项,事件e2的激活状态只有状态B中嵌套的子状态B2,会发生转换的情况应该如选项B描述的那样;而对于D选项,事件e1的激活状态是整个状态B,也就是说不论是B1、B2、B3抑或是B4都是激活状态,事件e1一发生就能触发状态转换。
- 2019年下半年

C,迁移要包含两个状态。
Ⅵ 活动图
活动图是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程,其中一般包括活动状态和动作状态、转换和对象,如下图所示:

- 2013年下半年:

C,这里需要弄清除的是UML活动图当中各个符号的含义。1)菱形表示的是流程当中的条件分支,将根据监护条件决定下一步执行的路径。2)黑色粗长条表示的是分叉/汇合结点,其作用是将单一流程拆分为多个并行执行的子流程/将子流程合并为单一流程继续执行。
Ⅶ 构件图
构件图展现了一组构件之间的组织和依赖关系,它与类图相关,通常把构件映射为一个或多个类、接口或者协作,如下图所示:

- 2009年上半年:

AB,在UML组件图当中,供接口和需接口之间的关系就是调用和被调用之间的关系。
Ⅷ 部署图
部署图是UML中用于描述系统物理架构的静态结构图,展示软件组件如何部署到硬件节点(如服务器、设备)上,以及节点间的通信关系,常在实施阶段使用,如下图所示:

Ⅸ 总结
表3-1 UML各种视图及其主要概念
主要的域 | 视图 | 图 | 主要概念 |
---|---|---|---|
结构 | 静态视图 | 类图 | 类、关联、泛化、依赖关系、实现、接口 |
用例视图 | 用例图 | 用例、参与者、关联、扩展、包括、用例泛化 | |
实现视图 | 构件图 | 构件、接口、依赖关系、实现 | |
部署视图 | 部署图 | 节点、构件、依赖关系、实现 | |
动态 | 状态机视图 | 状态图 | 状态、事件、转换、动作 |
活动视图 | 活动图 | 状态、活动、完成转换、分叉、结合 | |
交互视图 | 顺序图 | 交互、对象、消息、激活 | |
协作图 | 协作、交互、协作角色、消息 | ||
模型管理 | 模型管理视图 | 类图 | 包、子系统、模型 |
可扩展性 | 所有 | 所有 | 约束、构造型、标记值 |