關係
後麵的例子將針對某個具體目的來獨立地展示各種關係。雖然語法無誤,但這些例子可進一步精煉,在它們的有效範圍內包括更多的語義。
依賴(Dependency)
實體之間一個“使用”關係暗示一個實體的規範發生變化後,可能影響依賴於它的其他實例(圖D)。更具體地說,它可轉換為對不在實例作用域內的一個類或對象的任何類型的引用。其中包括一個局部變量,對通過方法調用而獲得的一個對象的引用(如下例所示),或者對一個類的靜態方法的引用(同時不存在那個類的一個實例)。也可利用“依賴”來表示包和包之間的關係。由於包中含有類,所以你可根據那些包中的各個類之間的關係,表示出包和包的關係。
圖D
關聯(Association)
實體之間的一個結構化關係表明對象是相互連接的。箭頭是可選的,它用於指定導航能力。如果沒有箭頭,暗示是一種雙向的導航能力。在Java中,關聯(圖E)轉換為一個實例作用域的變量,就像圖E的“Java”區域所展示的代碼那樣。可為一個關聯附加其他修飾符。多重性(Multiplicity)修飾符暗示著實例之間的關係。在示範代碼中,Employee可以有0個或更多的TimeCard對象。但是,每個TimeCard隻從屬於單獨一個Employee。
圖E
聚合(Aggregation)
聚合(圖F)是關聯的一種形式,代表兩個類之間的整體/局部關係。聚合暗示著整體在概念上處於比局部更高的一個級別,而關聯暗示兩個類在概念上位於相同的級別。聚合也轉換成Java中的一個實例作用域變量。
關聯和聚合的區別純粹是概念上的,而且嚴格反映在語義上。聚合還暗示著實例圖中不存在回路。換言之,隻能是一種單向關係。
圖F
合成(Composition)
合成 (圖G)是聚合的一種特殊形式,暗示“局部”在“整體”內部的生存期職責。合成也是非共享的。所以,雖然局部不一定要隨整體的銷毀而被銷毀,但整體要麼負責保持局部的存活狀態,要麼負責將其銷毀。局部不可與其他整體共享。但是,整體可將所有權轉交給另一個對象,後者隨即將承擔生存期職責。
Employee和TimeCard的關係或許更適合表示成“合成”,而不是表示成“關聯”。
圖G
泛化(Generalization)
泛化(圖H)表示一個更泛化的元素和一個更具體的元素之間的關係。泛化是用於對繼承進行建模的UML元素。在Java中,用extends關鍵字來直接表示這種關係。
圖H
實現(Realization)
實例(圖I)關係指定兩個實體之間的一個合同。換言之,一個實體定義一個合同,而另一個實體保證履行該合同。對Java應用程序進行建模時,實現關係可直接用implements關鍵字來表示。
圖I
補充:
3.關聯(Association)
[關聯]
對於兩個相對獨立的對象,當一個對象的實例與另一個對象的一些特定實例存在固定的對應關係時,這兩個對象之間為關聯關係。
[具體表現]
關聯關係是使用實例變量來實現
[現實例子]
比如客戶和訂單,每個訂單對應特定的客戶,每個客戶對應一些特定的訂單;再例如公司和員工,每個公司對應一些特定的員工,每個員工對應一特定的公司
[UML圖] (圖1.3)

圖1.3 公司和員工的關聯關係
[代碼表現]
-
1. public class Company{
-
2. private Employee employee;
-
3. public Employee getEmployee(){
-
4. return employee;
-
5. }
-
6. public void setEmployee(Employee employee){
-
7. this.employee=employee;
-
8. }
-
9. //公司運作
-
10. public void run(){
-
11. employee.startWorking();
-
12. }
-
13. }
(4)聚合(Aggregation)
[聚合]
當對象A被加入到對象B中,成為對象B的組成部分時,對象B和對象A之間為聚集關係。聚合是關聯關係的一種,是較強的關聯關係,強調的是整體與部分之間的關係。
[具體表現]
與關聯關係一樣,聚合關係也是通過實例變量來實現這樣關係的。關聯關係和聚合關係來語法上是沒辦法區分的,從語義上才能更好的區分兩者的區別。
[關聯與聚合的區別]
(1)關聯關係所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關聯關係,而不是聚合關係,因為人不是由自行車組成的。
聚合關係涉及的兩個對象處於不平等的層次上,一個代表整體,一個代表部分。比如電腦和它的顯示器、鍵盤、主板以及內存就是聚集關係,因為主板是電腦的組成部分。
(2)對於具有聚集關係(尤其是強聚集關係)的兩個對象,整體對象會製約它的組成對象的生命周期。部分類的對象不能單獨存在,它的生命周期依賴於整體類的對象的生命周期,當整體消失,部分也就隨之消失。比如張三的電腦被偷了,那麼電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤和內存)拆了下來。
[UML圖](圖1.4)

圖1.3 電腦和組件的聚合關係
[代碼表現]
-
1. public class Computer{
-
2. private CPU cpu;
-
3. public CPU getCPU(){
-
4. return cpu;
-
5. }
-
6. public void setCPU(CPU cpu){
-
7. this.cpu=cpu;
-
8. }
-
9. //開啟電腦
-
10. public void start(){
-
11. //cpu運作
-
12. cpu.run();
-
13. }
-
14. }