10.4.4 UML类图与对象图
类图和对象图是 UML 静态结构建模中最基础的一组图。类图描述“类型层面”的结构,对象图描述“某一时刻实例层面”的结构。
通俗地说:类图像系统的结构蓝图,对象图像某一瞬间的现场照片。
类图描述什么
类图描述一组类、接口、协作以及它们之间的关系。类一般用三栏矩形表示:
text
类名
----------------
属性
----------------
操作/方法属性对应对象内部保存的数据,方法对应对象能执行的行为。在程序语言中,属性常对应数据成员,方法常对应成员函数。
mermaid
classDiagram
class BookList {
+name
+addBook(book)
+removeBook(book)
}
class Book {
+title
+isbn
+borrow()
}
class BorrowRecord {
+borrowTime
+returnTime
}
class ComputerBook
class NonComputerBook
BookList "1" o-- "0..*" Book : contains
Book "1" --> "0..1" BorrowRecord : current record
ComputerBook --|> Book
NonComputerBook --|> Book上图可以读出几层信息:
BookList与Book是整体-部分关系,一个列表可以包含 0 到多本书。- 一本书可以没有当前借阅记录,也可以有一条当前借阅记录,因此是
0..1。 ComputerBook和NonComputerBook都是一种Book,所以是泛化/继承关系。
多重度怎么读
多重度标在关联两端,用来说明“一个对象能对应对方多少个对象”。不要只背 *,要会把自然语言翻译成数量区间。
| 多重度 | 含义 | 例子 |
|---|---|---|
1 | 恰好一个 | 一条借阅记录只对应一本书 |
0..1 | 可以没有,也可以有一个 | 一本书当前可以没有借阅记录,也可以有一条当前借阅记录 |
0..* 或 * | 可以没有,也可以有多个 | 一个书籍列表可以为空,也可以有多本书 |
1..* | 至少一个,可以多个 | 一个订单至少包含一个订单明细 |
m..n | 从 m 到 n 个 | 一个班级可设置 1 到 3 名班主任 |
课程里的关键提醒是:看多重度时要站在“一个对象”的角度。例如“一个列表有多少本书?”答案是 0 到多;“一本书属于几个列表?”在题目设定里通常是 1。
角色名与多个关联
关联线上可以标注角色。角色标在某一端时,表示该端对象在关系中扮演的身份;标在中间时,描述两端之间的关系名称。
同两个类之间可以有多个关联,只要角色不同。例如一个 Teacher 与 Course 之间,既可以有“主讲”关系,也可以有“审核”关系。考试中如果问“两个类之间能否有多个关联”,答案是可以,但要由不同角色区分。
对象图描述什么
对象图展示某一时刻对象之间的关系,是类图的实例快照。对象常写成:
text
对象名:类名如果对象没有命名,也可以写成:
text
:类名例如:
mermaid
classDiagram
class list1:::object {
<<BookList>>
}
class bookA:::object {
<<Book>>
title = "软件设计"
}
class record1:::object {
<<BorrowRecord>>
}
list1 --> bookA
bookA --> record1对象图不是在重新定义类,而是在回答:“当前这个时刻,系统里有哪些对象,它们之间实际连成什么样?”
用对象图校验类图
真题里常让你判断对象图是否与类图一致。做法是把对象图里的每条连接拿回类图多重度中核对。
判断步骤:
- 找到类图中的关联两端和多重度。
- 在对象图中统计某个对象实际连了多少个对方对象。
- 看这个数量是否落在类图允许的区间内。
- 注意题干问的是“一致”还是“不一致”。
例如类图规定 A 1 -- 0..* B,表示一个 A 可以对应 0 到多个 B,但一个 B 只能对应一个 A。如果对象图中出现一个 B 同时连到两个 A,就与类图不一致。
类图与对象图的区别
| 对比项 | 类图 | 对象图 |
|---|---|---|
| 层次 | 类型层 | 实例层 |
| 时间性 | 全局静态结构 | 某一时刻快照 |
| 主要元素 | 类、接口、属性、方法、关系 | 对象、属性值、对象链接 |
| 名称写法 | Book | book1:Book |
| 主要用途 | 建立系统结构模型 | 验证或展示某一时刻对象关系 |
例题
描述类、属性、方法和类之间关系的 UML 图是:
对象图主要描述的是:
自查要点
- 为什么说类图是蓝图,对象图是快照?
0..1、0..*、1..*分别怎样翻译成自然语言?- 对象图中
book1:Book的冒号前后分别表示什么? - 如何用对象图检查类图多重度是否一致?