在Java中,組合、聚合和關聯是描述類之間關系的三種不同方式,它們的核心區別在于對象間的依賴強度和生命周期管理。以下是它們的詳細對比:
1. 關聯(Association)
-
定義:最基本的類間關系,表示一個類知道另一個類(單向或雙向)。沒有嚴格的整體-部分關系,更多體現協作。
-
特點:
- 對象之間相互獨立,生命周期無必然關聯。
- 可以是臨時性的(如通過方法參數傳遞),也可以是長期持有引用。
- UML中表示為普通箭頭或直線。
-
示例:
class Teacher {void teach(Student student) {// 臨時關聯:通過方法參數傳遞} } class Student {private Teacher teacher; // 長期關聯:持有引用 }
2. 聚合(Aggregation)
-
定義:特殊的關聯關系,表示整體與部分的關系,但部分可以獨立存在。
-
特點:
- 弱“擁有”關系:整體(如汽車)由部分(如引擎)組成,但部分的生命周期不依賴整體。
- 部分通常由外部創建并通過參數傳入整體。
- UML中用空心菱形箭頭表示(菱形指向整體)。
-
示例:
class Engine {// 引擎可以獨立存在 }class Car {private Engine engine;public Car(Engine engine) {this.engine = engine; // 引擎從外部傳入} }
3. 組合(Composition)
-
定義:更強的聚合關系,表示嚴格的整體與部分,部分無法獨立存在。
-
特點:
- 強“擁有”關系:整體的生命周期控制部分的創建和銷毀。
- 部分通常由整體內部直接創建。
- UML中用實心菱形箭頭表示(菱形指向整體)。
-
示例:
class Heart {// 心臟不能脫離人體存在 }class Human {private Heart heart;public Human() {heart = new Heart(); // 心臟由人體創建} }
對比總結
特性 | 關聯 | 聚合 | 組合 |
---|---|---|---|
關系強度 | 弱 | 中等(整體-部分) | 強(整體-部分) |
生命周期依賴 | 無 | 部分獨立于整體 | 部分依賴整體 |
代碼實現 | 方法參數或成員變量 | 外部傳入部分對象 | 整體內部創建部分對象 |
UML表示 | 箭頭/直線 | 空心菱形箭頭 | 實心菱形箭頭 |
示例 | 學生使用圖書館 | 汽車擁有引擎 | 人類擁有心臟 |
關鍵記憶點
- 關聯:任何協作關系,無生命周期依賴。
- 聚合:“has-a”,部分可獨立存在(如汽車與引擎)。
- 組合:“contains-a”,部分不可獨立存在(如人類與心臟)。
通過分析對象間的依賴關系和生命周期管理,可以清晰區分這三種設計模式。