UML
类图有如下关系:继承(泛化)、实现、依赖、关联、聚合、组合。
关联 Association
定义
表示一个类中拥有另外一个类的实例,可以用直线,单箭头,双向箭头表示。
多重度
多重度有:1, 1..*, 0..*, 0..1
,对应表示一个类的实例能够与另一个类的多少个实例相关联。
0..1
表示拥有 0 或者 1 个实例。0..*
或者*
表示没有实例个数限制:0 个或多个。1
表示仅仅拥有 1 个实例。1..*
表示至少拥有 1 个实例。n..m
表示拥有n
到m
个实例。
类图
Customer
拥有多个 Car
的实例,类图关系通常使用单箭头表示。
Java
示例
1 | public class Car { |
聚合 Aggregation
其中菱形表示整体对象,箭头表示部分对象。
定义
比关联的关系更进一步,通常聚合有包含(has-a
)的意思,表示整体对象包含部分对象,而关联中的两个类是平级关系。整体对象不存在时,部分对象可以独立存在。使用空心菱形和箭头表示。
类图结构
Car
包含一个 Engine
,但是 Engine
可以独立存在。
Java
示例
1 | public class Engine{ |
组合 Composition
其中菱形表示整体对象,箭头表示部分对象。
定义
组合可以理解为特殊的聚合,整体对象和部分对象关系非常密切不能缺失,通常是强烈包含(contains-a
)的意思。整体对象与部分对象具有同一生命周期,整体对象控制着部分对象的创建和销毁。当整体对象不存在时,部分对象也不存在。使用实心菱形和箭头表示。
类图结构
Head
是 Bird
身体的一部分,不能独立存在。Head
实例是在 Bird
中创建的,由 Bird
控制它的生命周期。
Java
示例
1 | public class Head { |
继承(泛化) Generalization
定义
表示类的继承,子类和父类是 is-a
关系。使用空心三角实直线表示。
类图结构
Tiger
是 Animal
的子类,都有吃的动作。
Java
示例
1 | public class Animal{ |
实现 Realization
定义
表示接口的实现,使用空心三角虚直线表示。
类图结构
ArrayList
实现了 List
,完善所有的方法。
Java
示例
1 | public interface List{ |
依赖 Dependency
定义
主要体现某个类的方法使用了另外一个类的对象,两个类之间不存在拥有,包含等关联关系。使用虚线箭头表示。
类图结构
Person
在计算时使用了 Computer
去计算。
Java
示例
1 | public class Computer{ |
小结
各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖。
- 关联的两个对象之间一般是平等的
- 聚合和组合都是关联关系,但是强弱有区别。聚合关系是
has-a
关系,组合关系是contains-a
关系
网上有一个比较全的例子,体现类图的所有关系:
工具
本文画类图的工具为:StarUML 。工具箱中的功能基本满足常见类图需求,常用使用技巧:
- 接口实现
使用Composite Structure --> Realization
来表示,默认的Interface Realization
是一条直线。 - 注释换行
使用shift + Enter
实现换行。 - 内部类
在右边的Model Explorer
中,直接将类Builder
拖入类Product
,就可以表示内部类。将Builder
拖入类图中后,会多一个from Product
的标识。