此文為轉載文章:http://zjzkiss.cnblogs.com/
世界是普遍聯(lián)系的,因此程序世界中的類,也不可能是孤立的。UML為我們定義了它們之間的關系,就是:依賴、關聯(lián)、聚合、組合還有泛化。
泛化關系比較好理解,就是表示類之間的繼承關系。容易混淆的是依賴、關聯(lián)、聚合和組合的關系。這里做一些甄別:
1、 依賴和關聯(lián)的顛倒顛
在網(wǎng)上查找了一下依賴和關聯(lián)的區(qū)別,有說“關聯(lián)本身即是一種依賴”,亦有說“依賴是一種弱關聯(lián)”,其實說來說去是一檔子事。依賴和關聯(lián)都是說一個類用到了另一個類。其區(qū)別在于一個是使用,一個是擁有。
依賴:具有某種偶然性。比如說我要過河,沒有橋怎么辦,我就去借來一條小船渡過去。我與小船的關系僅僅是使用(借用)的關系。表現(xiàn)在代碼上,為依賴的類的某個方法以被依賴的類作為其參數(shù)。或者是class A 的某個方法創(chuàng)造了 class B 的實例抑或?qū)lass B的靜態(tài)方法的調(diào)用。如果A依賴于B,那意味著B的變化可能要求A也發(fā)生變化;
這是uml圖表示的依賴關系:
代碼表現(xiàn):

2

3

4

5

6

7

關聯(lián):有名的客戶和訂單的關系以及公司和員工的關系,都是關聯(lián)關系。還有就是我和我的單車的例子,他們都是一種“擁有”的關系。表現(xiàn)在代碼上,就是一個類包含另一個類的實例,通常表現(xiàn)為被關聯(lián)類以類屬性的形式出現(xiàn)在關聯(lián)類的類定義中,也可以表現(xiàn)為關聯(lián)類引用了一個類型為被關聯(lián)類的全局變量。關聯(lián)可以使單向的,也可以使雙向的。
從網(wǎng)上找到的公司和員工的UML圖和代碼 :
公司和員工的關聯(lián)關系

2

3

4

5

6

7

8

9

10

11

12

13

14

可見依賴于與關聯(lián)亦有動靜之別,關聯(lián)的類“靜態(tài)”地引用了被關聯(lián)類的實例變量,而依賴的偶然性也正說明了它的動態(tài)性。
2、 聚合與組合同出而異體
聚合與組合其實都是關聯(lián)的特例,都是整體和部分的關系。他們的區(qū)別在于聚合的兩個對象之間是可分離的,他們具有各自的生命周期。而組合往往表現(xiàn)為一種唇齒相依的關系。
聚合:一種容納或曰包含的關系,如同機場和飛機,汽車和輪胎的關系。其實仔細想想,前面的公司和員工的關系也有聚合的味道在里面。
組合:也可稱之為強聚合,整體和部分是不可分的,整體的生命周期結束時也就是部分的生命周期到頭時。很有名的就是桌子和桌子腿的關系。
聚合的UML圖:
組合的UML圖:
然而,聚合與組合的代碼表現(xiàn)形式是一樣的,都可以表現(xiàn)為以下的形式,它們僅僅具有語義上的區(qū)別。
網(wǎng)上找到的電腦和CPU的關系的代碼表現(xiàn):

2

3

4

5

6

7

8

9

10

11

12

13

14

15
