在UML的定義中,描述類和對象之間的關系,包括以下幾種方式:依賴(Dependency)、關聯(Association)、聚合(Aggregation)、組合(Composition)、泛化(Generalization)和實現(Realization)。現分別說明如下:
1. 依賴(Dependency)
在uml中,“依賴”表示為帶箭頭的虛線,箭頭指向被依賴的元素。是類與類之間的連接,表示為一個類依賴於另一個類的定義,其中一個類的變化將影響另一個類。依賴總是單向的,不應該存在雙向依賴,這一點要特別注意。更具體的說,依賴可以理解為:一個類(A)對不在其實例作用域內的另一個類或對象(B)的任何類型的引用。大致包含以下幾種情況:
(1)局部變量;
(2)方法的參數;
(3)靜態方法的調用;
下面是依賴關系的uml示意圖:
2. 關聯(Association)
在uml中,關聯表示為帶箭頭的實線。關聯可以是單向的,也可以是雙向的。如果是雙向關聯,則可以表示為雙向箭頭,或者沒有箭頭。一般來說,系統設計應表現為單向關聯,這樣利於維護。一個關聯可以附加“多重性”的修飾符,表示兩個類之間的數量關系。關聯可以理解為:一個類(A)持有另一個類或對象(B)。具體表現為:
(1)成員變量
下面是關聯關系的uml示例圖:
上面的關聯表示,一個Employee持有(has)0個或多個TimeCard。
3. 聚合(Aggregation)
在uml中,聚合關系表示為空心的菱形箭頭線。聚合關系是關聯關系的一種,表示一種“強”關聯關系。對比與關聯關系,兩個類是處於同一個層次的。而聚合關系,兩個類處於不同的層次,強調了一個整體/局部的關系。例如一輛汽車有一個引擎,4個輪胎。
在聚合關系中,體現了一種“弱擁有”的概念。也就是說,對象A擁有對象B,但B並不是A的組成部分。更具體的表現為,如果A由B聚合而成,則A包含B的全局對象,但B對象可以不在A對象創建時創建。回到前面的例子,汽車對象由輪胎對象聚合而成,但是輪胎對象的生命期並不受汽車對象的左右。當汽車對象銷毀時,輪胎對象也可以單獨存在!
下面是聚合關系的uml示意圖:
從代碼上看,聚合和關聯沒有任何區別。這里僅僅體現一種概念上的含義。在創建ClassA的時候,不一定需要同時創建ClassB的實例。
4. 組合(Composition)
在uml中,組合關系表示為實心菱形箭頭線。組合也叫合成。合成關系強調了比聚合關系更加強的整體/部分的關聯,例如人和四肢。和聚合關系所不同的是,在組合關系中,雖然局部不一定隨着整體的銷毀而銷毀,但整體要么負責保持局部的存活狀態,要么負責將其銷毀。也就是說,組合關系中,局部的存活期一定是小於,最多是等於整體的存活期的。
下面是組合關系的uml示例圖:
5. 泛化(Generalization)與實現(Realization)
泛化也就是通常所謂的繼承關系,在uml中表示為一個帶空心三角的實線。表示為is-a的關系,是對象間耦合度最大的一種關系,子類繼承父類的所有細節,並可以在此基礎上添加自己的特性。
下面是泛化關系的uml圖:
所謂實現就是對接口的定義實現,很簡單。表現為帶箭頭的虛線。下面的實現的uml圖: