UML类图中类与类之间的关系如下所示:
classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
Inheritance( 继承、泛化关系 )
classDiagram
classA --|> classB : Inheritance
很简单,A继承于B
ts
class classB { }
class classA extends classB { }
Composition( 组合 )
classDiagram
classC --* classD : Composition
实心的菱形,代表整体与部分中的组合关系。组合表示整体与部分的关系,且部分不能脱离整体而存在。通常在整体类中直接实例化部分类,并在整体类销毁时,部分类也会销毁。简单的举例:公司与部门的关系。公司死,部门肯定也不存在了,且部门不能独立于公司存在。
ts
class classD { }
class classC {
private d: classD;
constructor() {
this.d = new classD();
}
}
Aggregation( 聚合 )
空心菱形。同样是表达整体与部分的关系。但是两者之间可以独立存在。
classDiagram
classE --o classF : Aggregation
ts
class classF {}
class classE {
constructor(public f: classF) {} // classF 从外部注入,独立存在
}
// 使用示例
const f = new classF();
const e = new classE(f); // classF 可独立于 classE 存在
Association( 关联 )
classDiagram
classG --> classH : Association
简单的引用关系(无所有权)。此处代码表示和聚合非常相似。但是两者的语义不一样。
特性 | 聚合 (Aggregation) | 关联 (Association) |
---|---|---|
关系本质 | 整体-部分关系(Whole-Part) | 对象间平等协作 |
生命周期依赖 | 部分可独立于整体存在 | 完全独立 |
代码特征 | 引用来自外部(构造函数/方法传入) | 引用可以是任意方式建立 |
UML语义 | ◇ 空心菱形 (整体端) | 普通箭头或直线 |
设计意图 | "由...组成"(has-a) | "使用..."/"链接..." (uses-a) |
典型例子 | 汽车和轮子,学校和教师 | 学生选课程,用户使用支付服务 |
ts
class classH {}
class classG {
constructor(public h?: classH) {} // 可选关联
}
// 使用示例
const h = new classH();
const g = new classG(h); // classG 持有 classH 的引用
Link-Solid ( 实线连接 )
Link-Solid其实是Association关联关系的一种表现形式,Association通常代表单向的关联,而Link-Solid代表双向。
classDiagram
classI -- classJ : Link(Solid)
ts
class classJ {}
class classI {
j: classJ; // 双向关联
linkJ(target: classJ) {
this.j = target;
}
}
Dependency( 依赖 )
classDiagram
classK ..> classL : Dependency
临时性依赖(无持久化引用)
ts
class classL {}
class classK {
doSomething(param: classL) { // 临时依赖(参数/局部变量)
const temp = new classL(); // 或局部创建
}
}
Realization( 实现 )
虚线箭头代表实现关系。
classDiagram
classM ..|> classN : Realization
ts
interface classN {} // 接口定义
class classM implements classN {} // classM 实现 classN 的接口