首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

UML 關聯、聚合與組合深度解析:從代碼到建模的關係建模指南

     編輯:Java 相關知識

前言

在面向對象設計中,類之間的靜態關係是構建領域模型的基石。關聯、聚合、組合三者從鬆耦合到緊耦合遞進,準確區分它們對於表達業務語義、指導代碼實現至關重要。本文結合 UML 圖示、代碼範例與生命周期語義,為你徹底釐清三者的邊界。

一、關聯 — 最基礎的結構關係

定義:關聯是一種廣義的「有關」關係,表示一個對象知曉另一個對象,從而能發送消息或調用其方法。它是靜態結構關係,不涉及生命周期綁定。

代碼表現形式

  1. 成員變量引用(最典型)
class A {
    private B itemB; // A 持有 B 的引用
}
  1. 方法參數傳遞(臨時關聯)
class A {
    void test(B b) { ... } // 僅在方法調用期間持有引用
}

  1. 局部變量創建/訪問
class A {
    void foo() {
        B b = new B(); // 局部引用
        b.doSomething();
    }
}

UML 表示:實線箭頭(或雙向無箭頭),可標註角色名、多重性(如 1, 0..*, 1..*)。

二、聚合 — 「Has-a」的弱整體-部分關係

核心語義:整體與部分擁有獨立的生命周期。整體銷毀時,部分對象可能繼續存活,可被其他整體共享。

經典案例:Person 與 Address

  • 人「有」地址。
  • 地址對象可獨立創建,傳入 Person 構造器。
  • Person 銷毀後,Address 若被其他對象引用,不會被垃圾回收。

代碼實現

public class Address { /* ... */ }

public class Person {
    private Address address;

    public Person(Address address) { // 外部傳入,控制權在外部
        this.address = address;
    }
}

// 使用方式
Address addr = new Address();
Person person = new Person(addr);
// person 結束,addr 可能仍存活

UML 表示

空心菱形箭頭,菱形端指向整體。

聚合關係 UML 圖示

三、組合 — 「Contains-a」的強整體-部分關係

核心語義:部分完全屬於整體,生命周期強綁定。整體創建時創建部分,整體銷毀時必須銷毀部分。部分不能被外部共享或獨立存在。

經典案例:Car 與 Engine

  • 引擎是汽車的核心組成部分。
  • 引擎在 Car 內部 new 出來,隨 Car 生命周期同生共死。
  • 不存在「引擎被兩輛車共享」的業務邏輯。

代碼實現

public class Engine { /* ... */ }

public class Car {
    private Engine engine = new Engine(); // 內部創建,控制權在內部
    // 或在構造器中初始化
    // public Car() { this.engine = new Engine(); }
}
// Car 實例被 GC,內部 Engine 引用計數歸零,隨之回收

UML 表示

實心菱形箭頭,菱形端指向整體。

組合關係 UML 圖示

四、對比總結表

維度關聯聚合組合
耦合度最弱中等最強
語義知道/使用擁有/包含 (弱)組成/包含 (強)
生命周期完全獨立部分獨立於整體部分依賴整體
共享性可廣泛共享可被多個整體共享不可共享,專屬
創建方式外部傳入/查找外部傳入內部實例化
UML 符號實線箭頭空心菱形 + 實線實心菱形 + 實線

五、實戰判斷指南

  1. 問:部分能否脫離整體獨立存在? 是 → 聚合/關聯;否 → 組合。
  2. 問:部分是否可被多個整體同時共享? 是 → 聚合;否 → 組合。
  3. 問:整體是否負責部分的完整創建與銷毀? 是 → 組合;否 → 聚合/關聯。
  4. 問:只是單純的方法調用或臨時引用? 是 → 普通關聯。

結語

UML 建模的核心價值在於精準傳達設計意圖。不要為了畫圖而畫圖,而在代碼編寫前,先思考對象間的擁有權與生命周期契約:是「借用」(關聯)、「合夥」(聚合)還是「生死與共」(組合)。這種思維訓練,將直接提升你的領域建模與代碼架構能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved