三大關係對比
| 關係 | 符號 | 語義 | 代碼表現 | 耦合度 |
| 依賴 | ···> | Use-a:臨時使用 | 方法參數、局部變量、static 方法調用 | 最弱 |
| 聚合 | ◇— | Has-a:整體-部分,部分可獨立存在 | 成員變量引用,構造器/Setter 注入 | 中等 |
| 組合 | ◆— | Contains-a:整體-部分,部分不可獨立(生命週期綁定) | 成員變量,構造器內 new,無外部引用 | 強 |
| 繼承 | △— | Is-a:泛化-特化 | extends / implements | 最強 |
在線書店訂單系統建模範例
類識別
Book:ISBN、書名、價格、作者
Account:用戶ID、用戶名、密碼、餘額
Order:訂單號、下單時間、狀態、總價
Address:收貨人、電話、省市區、詳細地址
關係映射
// 依賴:Order 臨時依賴 Account 校驗餘額
public class Order {
public boolean checkout(Account account) { // 參數依賴
return account.getBalance() >= this.totalPrice;
}
}
// 聚合:Order 擁有 Book(書籍可被多訂單引用,獨立存在)
public class Order {
private List<Book> items = new ArrayList<>(); // 聚合
public void addItem(Book book) { items.add(book); }
}
// 組合:Order 擁有 Address(地址隨訂單生死,不共享)
public class Order {
private Address shippingAddress; // 組合
public Order(Address addr) { this.shippingAddress = addr; }
}
// 繼承:VipAccount 是 Account 的特化
public class VipAccount extends Account {
private int level; private double discount;
@Override public boolean checkout(Order o) { /* VIP 邏輯 */ }
}
設計原則
- 優先組合/聚合,少用繼承:繼承破壞封裝,父類變更波及所有子類
- 依賴倒置:高層模組依賴抽象(介面),不依賴具體實現
- 接口隔離:依賴盡可能細粒度介面,減少無關方法強制實現
- 區分聚合與組合:生命週期是否綁定是關鍵判斷標準