关联(Association), 聚合(Aggregation), 组合(Composition) 在软件设计模式中的区别

 

关联(Association)、聚合(Aggregation)与组合(Composition)的区别

这三种关系都是面向对象设计中描述类之间关系的重要概念,它们在耦合强度、生命周期管理等方面有显著差异。

1. 关联(Association)

基本特征

  • 最通用的关系类型,表示类之间的使用关系

  • 可以是单向或双向的

  • 关联对象有各自独立的生命周期

  • 通过成员变量实现

代码示例

java
Copy
class Teacher {
    private List<Student> students; // 教师关联多个学生
    
    public void addStudent(Student s) {
        students.add(s);
    }
}

class Student {
    // 可以没有对Teacher的引用(单向关联)
    // 也可以有(双向关联)
}

现实比喻
医生和患者的关系 - 医生认识患者,患者也认识医生,但两者可以独立存在

2. 聚合(Aggregation)

基本特征

  • 一种特殊的关联关系,表示**"has-a"**关系

  • 整体与部分的关系,但部分可以独立于整体存在

  • 空心菱形箭头表示( UML图中 )

  • 生命周期不绑定

代码示例

java
Copy
class Department {
    private List<Professor> professors; // 系包含教授
    
    public void addProfessor(Professor p) {
        professors.add(p);
    }
}

class Professor {
    // 可以独立于Department存在
}

现实比喻
汽车和车轮的关系 - 车轮属于汽车,但车轮也可以被拆卸后单独存在

3. 组合(Composition)

基本特征

  • 最强的关联形式,表示**严格的"part-of"**关系

  • 部分不能独立于整体存在

  • 实心菱形箭头表示( UML图中 )

  • 生命周期完全绑定

代码示例

java
Copy
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表示 普通箭头 空心菱形箭头 实心菱形箭头
能否共享 能(部分可属于多个整体) 不能
典型实现 成员变量 集合类型的成员变量 直接实例化成员对象
删除整体影响 不影响部分 不影响部分 部分会被一起删除
示例 医生-患者 汽车-车轮 房子-房间

设计选择建议

  1. 使用关联当:

    • 对象需要与其他对象协作

    • 关系是临时的或可变的

    • 对象生命周期独立

  2. 使用聚合当:

    • 需要表示"包含"但部分可独立存在

    • 部分对象可能被多个整体共享

    • 整体负责管理部分但不创建它们

  3. 使用组合当:

    • 部分对象没有独立存在的意义

    • 整体完全控制部分的生命周期

    • 需要强封装性,部分不应暴露给外部

记忆技巧

  • 关联:"认识"关系(A知道B存在)

  • 聚合:"拥有"关系(A包含B,但B可以没有A)

  • 组合:"由...组成"关系(A由B构成,B不能没有A)

理解这些差异有助于在软件设计中做出更合理的架构决策,特别是在领域模型设计和系统模块划分时。

posted @ 2025-03-27 11:04  MaxBruce  阅读(79)  评论(0)    收藏  举报