[軟工] 類別圖「關聯」、「聚合」及「組合」比較

「類別圖 (Class Diagram)」是用來描述系統所使用到的類別資訊及類別之間的關係。

這篇著重在類別間的關係這塊,之前都只記得「繼承 (inheritance)」類別及「實作(implement)」介面這兩塊,對「關聯(Association)」、「聚合(Aggreation)」及「組合(Composition)」三個關係來複習一下。

關聯(Association)

「關聯」其實是蠻常見的一種關係,指A類別會參考到B類別的資訊,但此兩類別是彼此獨立的,沒有一種擁有 (has-a) 的關係。例如「冷氣」與「天氣」:

public class AirCondition
{
    public string Name { get; set; }

    public Weather RoomWeather { get; set; }
}

public class Weather
{
    public double Teamprature { get; set; }

    public double Humidity { get; set; }
}

「關聯」的UML圖就是一條直線來代表

聚合(Aggreation)

「聚合」是具有 has-a 特性的一種「關聯」,但兩類別彼此還是獨立的,不會因為一個消失而另外也會消失。例如「課程」與「學生」的關係:

public class Course
{
    public string Name { get; set; }

    public List<Student> Students { get; set; }
}

public class Student
{
    public int Number { get; set; }

    public string Name { get; set; }
}

「課程」與「學生」的關係可以整理成下面兩點「聚合」的特性

  • 一門「課程」可以有0到n位「學生」修 → has-a 關係
  • 當一門「課程」無法順利開成時,沒有「學生」會消失 → 彼此獨立

其UML圖表示如下,用一個空心菱形和一條直線來連接,空心菱形放於此關係全體的那個類別

組合(Composition)

「組合」是「聚合」更進一步的關係,除了擁有 has-a 關係之外,他們還是互相相依的,一個類別物件不見的時候,另一個也會消失不見。像「飛機」與「引擎」此兩類別。

public class Plane
{
    public string Name { get; set; }

    public List<Engine> Engines{ get; set; }
}

public class Engine
{
    public int Number { get; set; }

    public string ModelName { get; set; }
}

一架「飛機」可以擁有多顆「引擎」,當該架「飛機」背摧毀的時候,機上的「引擎」也會背摧毀。當一架「飛機」被製造出來的時候,機上「引擎」們也會一起被製造出來。

其UML圖如下,由一個實心菱形和一條直線組成,菱形放置位置也是在此關係全體的那個類別

結論

由 Association 到 Aggregation 的差異是在有沒有 has-a 的特性。

由 Aggregation 到 Composition 的差異是在兩類別有沒有彼此獨立。