準則: 聚集
聚集用來建立模型元素之間的組合關係模型。這個準則示範如何使用這個關係。
關係
主要說明

聚集

聚集用來建立模型元素之間的組合關係模型。組合關係有許多範例:圖書館書籍,公司部門員工組成,電腦由許多裝置組成。為了建立這個模型,聚集(部門)與它的組成部分( 員工)之間,便有了一種聚集關聯。

在聚集端(整體)的關聯路徑端點會附加一個中空菱形,它用來表示這是一項聚集。

範例

在這個範例中,客戶 (Customer)地址 (Address)。我們使用聚集是因為這兩個類別代表較大整體的一部分。另外,我們也選擇地址的模型建立成個別類別,因為許多其他事物也都有地址。

聚集範例

聚集物件可以將其他物件存放在一起。

共用聚集

對應關係超出專為了聚集而建立之單項的聚集關係,稱為共用,在這個情況下,毀損聚集不必然會毀損組件。共用聚集會透過連帶作用形成一個圖形,或多根的目錄樹。當兩個類別關係緊密時,可以使用共用聚集,這時相同實例便可以參與兩個不同的聚集。

範例

請設想一位擁有家族企業的人士。「人員 (Person)」和「企業 (Business)」都有地址;事實上,它們是同一個地址。「地址 (Address)」是「人員」和「企業」都不可或缺的部分。縱使「企業」有可能消失,依然希望「人員」能保有原來的「地址」。

另外也請注意,在這個情況下,也可能開始時是共用聚集,日後卻又轉換成非共用聚集。家族企業可能會日漸繁榮昌盛,最後便移到不同的城區。這時「人員」和「企業」就不再共用相同的地址。於是,聚集便不再共用。

聚集範例

共用聚集範例

組合

組合是聚集的一種形式,它有強大的組件擁有權,且組件和聚集的生命期限相符。聚集端(這個範例是訂單 (Order))的對應關係不能超出一(也就是說,它不能共用)。另外,聚集也無法變更,也就是說,聚集建立好之後,它的鏈結便無法改變。連帶地,組合聚集也會形成組件「樹」,根是聚集,「枝」是組件。

當聚集和組件之間有強大的相互依賴關係時,應該在「一般」聚集之上使用組合聚集;這時若是沒有組件,聚集的定義便不完整。在下列範例中,即使沒有訂購項目(也就是行項目 (Line Item)),擁有一份訂單也仍有意義。在某些情況下,這種相互依賴關係可以早在分析之時便找出來(正如這個範例),但通常必須要到設計之時,才能有信心做出這般決策。

在關聯路徑端點會附加一個實心菱形,如下圖所示,用來表示這是一項組合:

組合聚集

組合聚集的範例

範例

在這個範例中,客戶介面 (Customer Interface) 由多個其他類別組成。在這個範例中,尚未指定聚集的對應關係。

組合聚集的範例

客戶介面物件知道有哪些顯示器 (Display)、收據印表機 (Receipt Printer)小鍵盤 (KeyPad)喇叭 (Speaker) 物件屬於它。

利用組合來建立類別內容的模型

類別的內容是類別對它有所瞭解的某個東西。如同上面所顯示的客戶類別的情況,您可以選擇將客戶的地址塑造成一個類別(如上圖所示),或建立成這個類別的一組屬性。使用類別和聚集關係,或使用一組屬性,要取決於下列各項:

  • 「內容」必須有獨立的身分,以方便多個物件參照它們嗎?若是如此,請使用類別和聚集。
  • 多個類別是否需要使用相同的「內容」?若是如此,請使用類別和聚集。
  • 「內容」本身也有複雜的結構和內容嗎?若是如此,請使用類別(一或多個)和聚集。
  • 否則,請使用屬性。

範例

自動櫃員機中,系統必須追蹤現行客戶及其 PIN,我們假設客戶介面負責這個動作。這項資訊可視為類別的「內容」。這可以利用個別類別來完成,顯示如下:

利用聚集來建立模型的內容

利用聚集來建立模型的物件內容

客戶介面利用屬性來追蹤目前的客戶及其 PIN 是替代方案,它的建模方式如下:

利用屬性來建立模型的內容

利用屬性來建立模型的物件內容

要使用屬性,或使用對於個別類別的聚集關聯?這個決策取決於代表的概念之間的聯結程度:當建模的概念關係密切時,使用屬性。當概念的變更可能互不相關時,使用聚集。

聚集或關聯?

只有在類別之間有組合關係、單一類別是由其他類別組成,或「組件」在整體的環境定義之外並不完整的情況下,才應該使用聚集。請設想訂單的情況:擁有一份「空無」所組成的「空白」訂單並沒有意義。所有聚集都是如此:「部門」必須有「員工」,「家族」必須有「家族成員」,依此類推。

如果在其他類別所提供的環境定義之外,類別可以有獨立的身分,如果類別不是某個較大整體的一部分,就應該使用關聯關係。另外,當無法確定時,關聯會比較適合;聚集通常比較明顯,選擇聚集只是為了有助於清楚。對於建模工作的成敗,這並非至關重要。

自我聚集

有時候,類別可以和本身形成聚集。這不全然表示該類別的實例由本身構成(這樣不符合邏輯), 而是表示類別的一個實例是相同類別的其他實例所構成的聚集。 在自我聚集的情況中,在辨別關聯的用途時,角色名稱非常重要。

範例

請設想下列包含產品 (Product) 類別的自我聚集:

自我聚集的範例

在這個情況下,產品可能是由其他產品組成;若是如此,所聚集的產品便稱為子產品。關聯只能從聚集導覽到子產品;也就是說,子產品不會知道它們是哪些產品的一部分(因為它們可能是許多產品的一部分)。