今天碰到一個題,問的是聚合和組合的區別,不是很清楚,到網上搜了一段話,摘錄如下:
聚合:表示兩個對象之間是整體和部分的弱關係,部分的生命週期可以超越整體。如電腦和鼠標。
組合:表示兩個對象之間是整體和部分的強關係,部分的生命週期不能超越整體,或者說不能脫離整體而存在。組合關係的“部分”,是不能在整體之間進行共享的。
不過,如果你要說,眼睛可以移植,是不是說可以脫離人而存在,它們就不是組合關係了?其實,UML中對象的關係都是在相應的軟件環境或實際場景下定義的,這裏區別聚合和組合的關係,關鍵還是在於它們之中整體和部分的關係強、弱,以及它們之間的依附關係。如果剛纔說眼睛可以移植給別人,那你也可以把它認爲是聚合,這都要結合實際場景來說明。
另外兩個比較重要的關係是關聯和依賴:
關聯:簡單的可以認爲,如果一個類作爲了另外一個類的屬性,那一定是關聯關係。但你要知道,聚合是一種特殊的關聯,而組合又是一種特殊的聚合。一般的關聯我們認爲是平級的、無整體部分關係的,如朋友關係。
依賴:對象之間的臨時關係,臨時性體現在不超越方法的週期。簡單的說,在方法使用到的,如參數類,就一定是依賴關係。
(以上文章來源於:http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html)
is a 關係,那麼它是一個集成關係;比如:我 is a 人;再比如菱形、圓形和方形都是形狀的一種,那麼他們都應該從形狀類繼承而不是聚合。
has a關係,那麼它是一個聚合關係;比如:我 has a 頭;再比如電腦是由顯示器、CPU、硬盤等組成的,那麼你應該把顯示器、CPU、硬盤這些類聚合成電腦類,而不是從電腦類繼承。
聚合和組合都屬於關聯,很難區分,但是隻要記住一點,區分它們就容易多了:
處於聚合關係的兩個類生命週期不同步,則是聚合關係;處於組合關係的兩個類的生命週期同步;eg:聚合關係,當A創建的時候,B不一定創建;當A消亡時,B不一定消亡。class A{ private B;}class B{....}組合關係,當創建一個A對象時,也會創建一個B對象;當A對象消亡時,作爲A的屬性的B對象也會消亡。class A{private B b=new B();....}class B{....}
(以上文章來源於:http://hi.baidu.com/yxj1141/blog/item/e7a95f1d7c886b9886d6b679.html)