2011-08-25 56 views
6

我知道在Java中有不同的關聯轉換方式,聚合和組合。但是當我們將它們轉換爲代碼(Java類)時,它們都以相同的方式表示。就像由老師教授的關聯的學生一樣,代表具有班主任實例變量的學生班。將關聯,聚合和組合轉換爲java中的代碼?

部門有聚合的教授也將用具有班級教授實例變量(數組)的部門類表示。

大學有組成部門也將以具有Class部門的實例變量(數組)的大學班級來表示。

所以所有的代碼都以相同的方式重新排列。那麼協會,聚合和組合爲開發者提供了什麼好處?

回答

4

您錯過了Composition的部分故事。它要求一對夫婦的額外屬性:

  • 不變性父(即兒童無法切換的父母)
  • 爲孩子生命週期的責任在於父母。即父母負責創建和刪除子實例。父母去世後,孩子無法生活。

您是對的,該協會將分別顯示爲子女&家長的參考/參考集合。但是,如果要確保強制實施Composition語義,代碼還必須執行上述規則。

至於聚合:我不使用它。語義過於寬鬆,與直接關聯無關。

hth。

+0

對不起,sfinnie我錯過了這兩點。 Point1: - 如果我們在原始文章中考慮組合示例,那麼您是否在說大學類應該具有Class部門的實例變量(數組)作爲final。如果不是我們將如何在代碼中表示它。 Point2: - 是的,我同意你的觀點,但是當我們將uml圖轉換爲編碼時並沒有什麼區別,因爲它仍然是一個簡單的實例變量。 –

+0

點1:是的。第2點:這不僅僅是參考。 UML複合語義要求「如果刪除了一個組合,它的所有部分通常都會被刪除」(UML superstructure 2.3,page 40)。在像C++這樣的非GC語言中,這意味着析構函數代碼必須確保刪除父項之前刪除所有子項。對於GC環境而言,這一點不太明顯。然而,還有一些成語 - 例如由領域驅動設計推廣的「聚合根」方法,其中創建(或移除)兒童的唯一方法是通過父類本身的方法......(ctd)。 – sfinnie

+0

...所以在原型Order/OrderLine場景中,從Order添加OrderLine的唯一方法是調用Order.AddOrderLine()(同樣用於刪除)。所以總結一下:代碼中沒有直接的聲明式模擬表示複合。相反,你必須在程序上建立行爲。因此,在代碼中識別複合材料需要大量的「模式識別」。如果引用是最終的,並且創建/刪除孩子的唯一方法是通過父級的接口,則該關係可能是Composite。心連心。 – sfinnie