软件工程收官之后,讲面向对象的核心装备:UML 类图的六种关系。
上午题考它,是给你一段场景描述(或一张图),让你判断是哪种关系;下午面向对象大题考它,是让你读完整的类图填代码——图上的每一根线不认识,代码就无从填起。好消息是:六种关系的考点就两件事——概念怎么区分和图形怎么画,都是有死规矩的。
一、总览:先记住强度排序
六种关系从强到弱:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
越往左,两个类绑得越死;最右边的依赖最"塑料",只是临时用一下。
二、逐个击破:定义 + 图形 + 例子
1. 泛化(继承)——"是一种"(is-a)
子类继承父类:狗是一种动物。图形:实线 + 空心三角形,三角形指向父类。
狗 ──────▷ 动物 (实线,空心三角指向父类)
2. 实现——"类实现接口"
类承诺兑现接口定义的功能:ArrayList 实现 List。图形:虚线 + 空心三角形,三角形指向接口。和泛化同用一个三角,但线换成虚线——实线继承类,虚线实现接口。
3. 依赖——"临时用一下"(use-a)
一个类在方法里用到另一个类:作为方法参数、局部变量,或调用其静态方法。比如"人写字"的方法里用到了"笔"。图形:虚线 + 普通箭头,箭头指向被使用的类。关系最弱,用完即走。
4. 关联——"长期持有"(has-a)
一个类的对象作为成员变量长在另一个类里:教师类里有"学生列表"。图形:实线(可带箭头表示导航方向)。比依赖强在"长期"——不是某个方法临时用,而是结构上一直拥有。
5. 聚合——"整体-部分,但能分家"
特殊的关联,强调整体与部分,且部分可以脱离整体独立存在。图形:实线 + 空心菱形,菱形在整体一端。
班级 ◇────── 学生 (空心菱形在"班级"这端)
学生转班了还是学生;轮胎从车上拆下来还能装到别的车上——能分家,就是聚合。
6. 组合——"整体-部分,同生共死"
比聚合更强的整体-部分:部分不能脱离整体独立存在。图形:实线 + 实心菱形,菱形在整体一端。
人 ◆────── 心脏 (实心菱形在"人"这端)
窗口销毁了,上面的按钮随之消失;心脏无法脱离人体独立存在——同生共死,就是组合。
三、三大辨析:坑都集中在这里
辨析一:聚合 vs 组合——部分能否独立生存? 能独立 → 聚合(空心菱形);不能 → 组合(实心菱形)。班级与学生、图书馆与书籍、车队与汽车,都是聚合;人与心脏、窗口与按钮,都是组合。
辨析二:关联 vs 依赖——看关系落在哪。 落在成员变量上 → 关联(长期结构关系);只出现在方法参数/局部变量里 → 依赖(临时使用)。教师持有学生列表是关联;人的写字方法接收一支笔作参数是依赖。
辨析三:泛化 vs 实现——看线型。 继承类 → 实线空心三角(泛化);实现接口 → 虚线空心三角(实现)。三角相同,虚实不同。
四、图形速记表(背这张就够)
| 关系 | 线型 | 端部符号 | 关键朝向 |
|---|---|---|---|
| 泛化 | 实线 | 空心三角 | 指向父类 |
| 实现 | 虚线 | 空心三角 | 指向接口 |
| 关联 | 实线 | (可有箭头) | — |
| 聚合 | 实线 | 空心菱形 | 菱形在整体端 |
| 组合 | 实线 | 实心菱形 | 菱形在整体端 |
| 依赖 | 虚线 | 普通箭头 | 指向被用者 |
口诀:三角管继承(实泛化、虚实现),菱形管整体(空聚合、实组合),虚线箭头是依赖,光杆实线是关联;三角指向父辈,菱形跟着整体。
五、10 道练习题
基础题(1~5)
1. UML 类图中,表示泛化(继承)关系的图形是( )。
A. 实线带空心三角,指向父类 B. 虚线带空心三角 C. 实线带空心菱形 D. 虚线带普通箭头
2. 类实现接口时,UML 类图中的表示是( )。
A. 实线带空心三角 B. 实线带实心菱形 C. 虚线带空心三角,指向接口 D. 实线带普通箭头
3. 类 A 的某个方法以类 B 的对象作为参数使用,则 A 与 B 之间最可能的关系是( )。
A. 泛化 B. 聚合 C. 依赖 D. 组合
4. 汽车与轮胎(轮胎可拆下安装到其他汽车上)之间的关系属于( )。
A. 组合 B. 聚合 C. 泛化 D. 依赖
5. 下列关系中,耦合强度最弱的是( )。
A. 泛化 B. 组合 C. 关联 D. 依赖
进阶题(6~10,带坑)
6. 窗口与窗口中的按钮(窗口销毁时,按钮随之销毁)之间的关系属于( )。
A. 聚合 B. 组合 C. 关联 D. 依赖
7. 类图中两个类以实线相连,且其中一端为空心菱形,该图表示的关系是( )。
A. 聚合 B. 组合 C. 泛化 D. 实现
8. 在聚合关系的图示中,空心菱形应画在( )。
A. 部分的一端 B. 整体的一端 C. 任意一端均可 D. 两端都要画
9. 教师类中定义了成员变量"学生列表",则教师与学生之间的关系是( )。
A. 依赖,因为教师用到了学生 B. 聚合,因为是整体与部分 C. 泛化,因为有继承意味 D. 关联,因为学生作为教师的成员变量长期存在
10. 下列四对事物中,最适合用"组合"关系描述的是( )。
A. 班级与学生 B. 图书馆与书籍 C. 人与心脏 D. 车队与汽车
六、答案与详解
1. A 泛化 = 实线 + 空心三角 + 指向父类。B 是实现的画法(虚线);C 是聚合的零件;D 是依赖。识图题第一原则:先看线型虚实,再看端部符号。
2. C 实现 = 虚线 + 空心三角 + 指向接口。和泛化同一个三角,实线继承类、虚线实现接口——这对是软考识图的常驻嘉宾。
3. C 方法参数里的"临时使用" → 依赖,六种关系里最弱的一种。判断要诀:这个 B 有没有成为 A 的成员变量?没有,只是方法里经手一下——依赖。
4. B 整体-部分且能分家(轮胎可拆、可另装)→ 聚合,空心菱形。
5. D 强度排序"泛化=实现 > 组合 > 聚合 > 关联 > 依赖",垫底的依赖最弱——临时用一下,几乎谈不上绑定。
6. B 大坑。整体-部分不假,但关键在"同生共死":窗口销毁,按钮无法独立存活 → 这是组合(实心菱形),不是聚合。聚合的部分是能单飞的(学生转班、轮胎换车)。判据永远一句:部分能否独立生存?
7. A 空心菱形 = 聚合;实心菱形才是组合。一空一实,一弱一强,识图题就爱在这对双胞胎上做文章。
8. B 菱形永远跟着整体走。记法:菱形像整体张开的一个"口袋",部分那一端往口袋里装。聚合组合都遵守这个朝向,记一个等于记两个。
9. D 本题大坑。看到"用到了学生"就选依赖?错——学生是以成员变量身份长期存在于教师类中的,这是结构上的拥有关系 → 关联。依赖只覆盖"方法参数/局部变量"级别的临时使用。判据:落在成员变量上是关联,落在方法签名里是依赖。
10. C 逐项过:班级与学生(学生可转班)、图书馆与书籍(书可剔旧流转)、车队与汽车(车可调度)——部分都能独立存在,全是聚合;只有人与心脏同生共死 → 组合。
七、五句话带走
-
强度排序:泛化=实现 > 组合 > 聚合 > 关联 > 依赖;
-
三角管继承:实线泛化指向父类,虚线实现指向接口;
-
菱形管整体:空心聚合、实心组合,菱形永远在整体端;
-
聚合组合的分水岭:部分能否独立生存(轮胎聚合、心脏组合);
-
关联依赖的分水岭:成员变量 = 关联,方法参数 = 依赖。
下一篇预告:转进计算机网络——上午题的稳定计算点:OSI 与 TCP/IP 模型分层(设备各在哪一层)、IP 地址与子网划分(给你 IP 和子网掩码,算网络号、主机数、广播地址)。进制转换练过的基本功,在这里要二次变现了。
&spm=1001.2101.3001.5002&articleId=163010368&d=1&t=3&u=52c6e2abbd63411893653b8314c57528)
2087

被折叠的 条评论
为什么被折叠?



