【面向对象】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️⃣ 最容易混淆的三对关系(软考陷阱)

  1. 依赖 vs 关联(考察重点)
  • 依赖是"用完就扔"(作为方法参数传入)。
  • 关联是"长期持有"(作为类的成员变量)。
  • 做题技巧 :题目描述中出现"作为参数"、"局部变量" → 选依赖
  1. 聚合 vs 组合(考察重点)
  • 聚合是"弱绑定":部分离开整体,依然有存在的意义(雁群和大雁)。
  • 组合是"强绑定":部分离开整体,毫无意义或同时消亡(人脑和人体)。
  • 做题技巧 :题目描述出现"包含"、"由...组成"、"同生共死" → 选组合 ;出现"聚集"、"集合"、"组装"且部分可独立 → 选聚合
  1. 泛化 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。请判断:

  1. 该符号表示( )关系。
  2. 如果B类对象被销毁,A类对象( )。
    A. 一定同时被销毁  B. 不一定同时被销毁

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #UML类图 #依赖 #关联 #聚合 #组合 #泛化 #实现 #软考备考

相关推荐
aaaameliaaa6 小时前
字符函数和字符串函数
c语言·笔记·算法
tq10868 小时前
开放与封闭:类型系统的安全哲学
笔记
龙仔7258 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
韭菜炒鸡肝天8 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
峥无11 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波11 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
早睡早起身体好12313 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
@Mike@14 小时前
06-数据库学习笔记(存储模型与数据压缩)
数据库·笔记·学习
不在逃避q15 小时前
Golang笔记之Redis
redis·笔记·golang