关联(Association)、聚合(Aggregation)与组合(Composition)的区别
这三种关系都是面向对象设计中描述类之间关系的重要概念,它们在耦合强度、生命周期管理等方面有显著差异。
1. 关联(Association)
基本特征:
-
最通用的关系类型,表示类之间的使用关系
-
可以是单向或双向的
-
关联对象有各自独立的生命周期
-
通过成员变量实现
代码示例:
class Teacher {private List<Student> students; // 教师关联多个学生public void addStudent(Student s) {students.add(s);}
}class Student {// 可以没有对Teacher的引用(单向关联)// 也可以有(双向关联)
}
现实比喻:
医生和患者的关系 - 医生认识患者,患者也认识医生,但两者可以独立存在
2. 聚合(Aggregation)
基本特征:
-
一种特殊的关联关系,表示**"has-a"**关系
-
整体与部分的关系,但部分可以独立于整体存在
-
空心菱形箭头表示( UML图中 )
-
生命周期不绑定
代码示例:
class Department {private List<Professor> professors; // 系包含教授public void addProfessor(Professor p) {professors.add(p);}
}class Professor {// 可以独立于Department存在
}
现实比喻:
汽车和车轮的关系 - 车轮属于汽车,但车轮也可以被拆卸后单独存在
3. 组合(Composition)
基本特征:
-
最强的关联形式,表示**严格的"part-of"**关系
-
部分不能独立于整体存在
-
实心菱形箭头表示( UML图中 )
-
生命周期完全绑定
代码示例:
class House {private Room livingRoom; // 组合关系private Room kitchen;public House() {this.livingRoom = new Room(); // 房间随房子创建this.kitchen = new Room(); // 房间不能独立于房子存在}
}class Room {// 不能独立于House存在
}
现实比喻:
人体和心脏的关系 - 心脏不能独立于人体存在
三者的关键区别对比
特性 | 关联(Association) | 聚合(Aggregation) | 组合(Composition) |
---|---|---|---|
关系强度 | 弱 | 中等 | 强 |
生命周期 | 独立 | 部分独立于整体 | 部分依赖整体 |
UML表示 | 普通箭头 | 空心菱形箭头 | 实心菱形箭头 |
能否共享 | 能 | 能(部分可属于多个整体) | 不能 |
典型实现 | 成员变量 | 集合类型的成员变量 | 直接实例化成员对象 |
删除整体影响 | 不影响部分 | 不影响部分 | 部分会被一起删除 |
示例 | 医生-患者 | 汽车-车轮 | 房子-房间 |
设计选择建议
-
使用关联当:
-
对象需要与其他对象协作
-
关系是临时的或可变的
-
对象生命周期独立
-
-
使用聚合当:
-
需要表示"包含"但部分可独立存在
-
部分对象可能被多个整体共享
-
整体负责管理部分但不创建它们
-
-
使用组合当:
-
部分对象没有独立存在的意义
-
整体完全控制部分的生命周期
-
需要强封装性,部分不应暴露给外部
-
记忆技巧
-
关联:"认识"关系(A知道B存在)
-
聚合:"拥有"关系(A包含B,但B可以没有A)
-
组合:"由...组成"关系(A由B构成,B不能没有A)
理解这些差异有助于在软件设计中做出更合理的架构决策,特别是在领域模型设计和系统模块划分时。