「類別圖 (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 的差異是在兩類別有沒有彼此獨立。