【面向对象】UML结构图:类图(类的关系:依赖/关联/聚合/组合/泛化/实现)
考点频率:★★★★★(下午题必考,类图是UML建模的核心,六大关系符号辨识是选择题高频考点)
难度:⭐⭐⭐⭐
建议:重点区分“聚合 vs 组合”的生命周期差异,以及“依赖 vs 关联”的强度差异,别让符号在脑子里“撞车”
1️⃣ 类图到底在画什么?
类图(Class Diagram)是UML中使用频率最高、最重要的图。它描述系统的静态结构——即系统中有哪些类、类有哪些属性和方法,以及这些类之间如何相互关联。
想象一下,你要装修房子,类图就是房子的“户型图”。户型图上标明了有几室几厅(类)、每个房间有多大(属性)、房间门朝哪开(方法),以及房间与房间之间的位置关系(关系)。
在软考下午题中,通常会给你一段需求描述,让你识别类之间的关系,或者在已有的类图上补全缺失的关系线和注释。所以,看懂六大关系的符号和语义,是下午题拿分的硬门槛。
2️⃣ 类图的基本组成(快速复习)
在UML类图中,一个类的图标是一个矩形,通常分为三个部分:
| 部分 | 内容 | 示例 |
|---|---|---|
| 顶部 | 类名(通常加粗/居中) | 订单 |
| 中部 | 属性(成员变量) | - 订单编号: 字符串 |
| 底部 | 方法(成员函数) | + 计算总价(): 浮点数 |
符号速记:
-表示private(私有),+表示public(公有),#表示protected(受保护)。
3️⃣ 六大关系深入解析(重头戏)
这六种关系在类图中通过不同的连线符号来区分。务必记住:箭头永远指向“被依赖/被关联/被继承/被实现”的一方。
3.1 依赖(Dependency)—— 虚线箭头------>
- 语义:一个类暂时性地使用另一个类。这种关系通常体现在局部变量、方法参数、静态方法调用上。
- 特点:关系最弱,类A的变化可能会影响类B,反之不一定。A不持有B的引用。
- 示例:
人需要买票(车票)。车票只是人买票方法的参数,人不会把车票揣在兜里当自己的属性。 - 符号:
B - - - - > A(B依赖A)。
3.2 关联(Association)—— 实线箭头———>
- 语义:一个类长期性地持有另一个类的引用,两者之间存在结构化的关系。它描述了“A认识B”。
- 特点:比依赖强。关联可以是单向(A认识B,B不认识A)或双向(A认识B,B也认识A),双向关联在软考中常有两条箭头或一条无箭头的实线。
- 示例:
学生和班级。学生类里有一个班级 我的班级的成员变量。 - 符号:
B ———> A(B关联A)。
3.3 聚合(Aggregation)—— 空心菱形实线◇———
- 语义:表示“整体-部分”的关系,但部分可以独立于整体存在(生命周期不同步)。菱形画在整体那一端。
- 特点:一种特殊的关联(关联的强化版),代表“has-a”关系,但关联度不紧密。整体没了,部分还能接着用。
- 示例:
汽车◇———轮胎。汽车报废了,轮胎(假设完好)可以拆下来给别的汽车用。 - 符号:
整体 ——◇——> 部分。
3.4 组合(Composition)—— 实心菱形实线◆———
- 语义:表示“整体-部分”的关系,但部分无法独立于整体存在(生命周期同步)。菱形画在整体那一端。
- 特点:最强的整体-部分关系。整体负责创建和管理部分,整体销毁时,部分也随之销毁(同生共死)。
- 示例:
公司◆———部门。公司注销了,部门自然就不存在了(除非部门独立成新公司,但那在业务逻辑里视为解散)。 - 符号:
整体 ——◆——> 部分。
3.5 泛化(Generalization)—— 实线空心三角箭头———▷
- 语义:表示继承关系,即“is-a”关系。子类继承父类的属性和方法。
- 特点:从子类指向父类。箭头是空心三角形。
- 示例:
狗———▷动物。 - 符号:
子类 ——▷ 父类。
3.6 实现(Realization)—— 虚线空心三角箭头---▷
- 语义:表示类与接口之间的实现关系。类实现了接口中定义的所有方法。
- 特点:从实现类指向接口。箭头是空心三角形。
- 示例:
猫—▷宠物(接口)。 - 符号:
实现类 ---▷ 接口。
特别注意:在软考下午题中,如果不确定该画聚合还是组合,就画关联。关联是语义最宽泛的关系,能覆盖聚合和组合的部分含义。这样不容易被扣分,因为关联是所有结构化关系的“底裤”。
4️⃣ 一张表背下所有符号(重点)
| 关系 | 英文 | 符号 | 连接线 | 菱形/三角 | 箭头方向 | 关系强弱 |
|---|---|---|---|---|---|---|
| 依赖 | Dependency | ------> | 虚线 | 无 | 指向被使用者 | 最弱 |
| 关联 | Association | ———> | 实线 | 无 | 指向被持有者 | 弱 |
| 聚合 | Aggregation | ◇——— | 实线 | 空心菱形 | 指向部分(被包含者) | 中 |
| 组合 | Composition | ◆——— | 实线 | 实心菱形 | 指向部分(被包含者) | 强 |
| 泛化 | Generalization | ———▷ | 实线 | 空心三角(朝左) | 指向父类 | 强 |
| 实现 | Realization | ---▷ | 虚线 | 空心三角(朝左) | 指向接口 | 中 |
5️⃣ 最容易混淆的三对关系(软考陷阱)
- 依赖 vs 关联(考察重点)
- 依赖是“用完就扔”(作为方法参数传入)。
- 关联是“长期持有”(作为类的成员变量)。
- 做题技巧:题目描述中出现“作为参数”、“局部变量” → 选依赖。
- 聚合 vs 组合(考察重点)
- 聚合是“弱绑定”:部分离开整体,依然有存在的意义(雁群和大雁)。
- 组合是“强绑定”:部分离开整体,毫无意义或同时消亡(人脑和人体)。
- 做题技巧:题目描述出现“包含”、“由…组成”、“同生共死” → 选组合;出现“聚集”、“集合”、“组装”且部分可独立 → 选聚合。
- 泛化 vs 实现(符号区分)
- 线型不同:一个实线(泛化),一个虚线(实现)。
- 三角相同(都是空心三角)。
- 做题技巧:看目标端是类还是接口。类与类 →泛化;类与接口 →实现。
6️⃣ 经典例题
例题1(下午题常见形式):在UML类图中,若类A的方法中包含了类B的局部变量,则类A和类B之间的关系是( )。
A. 关联
B. 依赖
C. 聚合
D. 实现
解析:局部变量是“用完就扔”的临时关系,属于依赖。选B。
例题2(高频陷阱):某系统中定义了“订单”类和“订单明细”类,每个订单包含多个订单明细,当订单被删除时,其订单明细也必须被删除。这两个类之间的关系应为( )。
A. 关联
B. 聚合
C. 组合
D. 依赖
解析:订单删了,明细也必须删(同生共死),生命周期一致 →组合。注意题干说“必须被删除”是强绑定。选C。
7️⃣ 记忆口诀
虚线箭头是依赖,用完即走不欠债。
实线箭头是关联,长期持有当成员。
空心菱形是聚合,分开还能单独活。
实心菱形是组合,同生共死跑不脱。
实线三角是泛化,子承父业属 IS-A。
虚线三角是实现,类把接口契约签。
8️⃣ 小测验(评论区对答案)
某UML类图中,类A与类B之间的连线为
A ———◇ B。请判断:
- 该符号表示( )关系。
- 如果B类对象被销毁,A类对象( )。
A. 一定同时被销毁 B. 不一定同时被销毁
🔔本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #UML类图 #依赖 #关联 #聚合 #组合 #泛化 #实现 #软考备考