深刻淺出UML類圖(二)

類與類之間的關係(1)

      在軟件系統中,類並非孤立存在的,類與類之間存在各類關係,對於不一樣類型的關係,UML提供了不一樣的表示方式。java

      1. 關聯關係編程

      關聯(Association)關係是類與類之間最經常使用的一種關係,它是一種結構化關係,用於表示一類對象與另外一類對象之間有聯繫,如汽車和輪胎、師傅和徒弟、班級和學生等等。在UML類圖中,用實線鏈接有關聯關係的對象所對應的類,在使用Java、C#和C++等編程語言實現關聯關係時,一般將一個類的對象做爲另外一個類的成員變量。在使用類圖表示關聯關係時能夠在關聯線上標註角色名,通常使用一個表示二者之間關係的動詞或者名詞表示角色名(有時該名詞爲實例對象名),關係的兩端表明兩種不一樣的角色,所以在一個關聯關係中能夠包含兩個角色名,角色名不是必須的,能夠根據須要增長,其目的是使類之間的關係更加明確。編程語言

      如在一個登陸界面類LoginForm中包含一個JButton類型的註冊按鈕loginButton,它們之間能夠表示爲關聯關係,代碼實現時能夠在LoginForm中定義一個名爲loginButton的屬性對象,其類型爲JButton。如圖1所示:this

圖1 關聯關係實例spa

      圖1對應的Java代碼片斷以下:.net

[java]  view plain  copy
 
  1. public class LoginForm {  
  2. private JButton loginButton; //定義爲成員變量  
  3. ……  
  4. }  
  5.   
  6. public class JButton {  
  7.     ……  
  8. }  

      在UML中,關聯關係一般又包含以下幾種形式:orm

      (1) 雙向關聯對象

      默認狀況下,關聯是雙向的。例如:顧客(Customer)購買商品(Product)並擁有商品,反之,賣出的商品總有某個顧客與之相關聯。所以,Customer類和Product類之間具備雙向關聯關係,如圖2所示:blog

圖2  雙向關聯實例生命週期

      圖2對應的Java代碼片斷以下:

[java]  view plain  copy
 
  1. public class Customer {  
  2. private Product[] products;  
  3. ……  
  4. }  
  5.   
  6. public class Product {  
  7. private Customer customer;  
  8. ……  
  9. }  

      (2) 單向關聯

      類的關聯關係也能夠是單向的,單向關聯用帶箭頭的實線表示。例如:顧客(Customer)擁有地址(Address),則Customer類與Address類具備單向關聯關係,如圖3所示:

圖3 單向關聯實例

      圖3對應的Java代碼片斷以下:

[java]  view plain  copy
 
  1. public class Customer {  
  2. private Address address;  
  3. ……  
  4. }  
  5.   
  6. public class Address {  
  7. ……  
  8. }  

      (3) 自關聯

      在系統中可能會存在一些類的屬性對象類型爲該類自己,這種特殊的關聯關係稱爲自關聯。例如:一個節點類(Node)的成員又是節點Node類型的對象,如圖4所示:

圖4 自關聯實例

      圖4對應的Java代碼片斷以下:

[java]  view plain  copy
 
  1. public class Node {  
  2. private Node subNode;  
  3. ……  
  4. }  

      (4) 多重性關聯

      多重性關聯關係又稱爲重數性(Multiplicity)關聯關係,表示兩個關聯對象在數量上的對應關係。在UML中,對象之間的多重性能夠直接在關聯直線上用一個數字或一個數字範圍表示。

      對象之間能夠存在多種多重性關聯關係,常見的多重性表示方式如表1所示:

表1  多重性表示方式列表

 

表示方式

多重性說明

1..1

表示另外一個類的一個對象只與該類的一個對象有關係

0..*

表示另外一個類的一個對象與該類的零個或多個對象有關係

1..*

表示另外一個類的一個對象與該類的一個或多個對象有關係

0..1

表示另外一個類的一個對象沒有或只與該類的一個對象有關係

m..n

表示另外一個類的一個對象與該類最少m,最多n個對象有關係 (m≤n)

 

      例如:一個界面(Form)能夠擁有零個或多個按鈕(Button),可是一個按鈕只能屬於一個界面,所以,一個Form類的對象能夠與零個或多個Button類的對象相關聯,但一個Button類的對象只能與一個Form類的對象關聯,如圖5所示:

圖5 多重性關聯實例

      圖5對應的Java代碼片斷以下:

[java]  view plain  copy
 
  1. public class Form {  
  2. private Button[] buttons; //定義一個集合對象  
  3. ……  
  4. }  
  5.   
  6. public class Button {  
  7. ……  
  8. }  

      (5) 聚合關係

      聚合(Aggregation)關係表示總體與部分的關係。在聚合關係中,成員對象是總體對象的一部分,可是成員對象能夠脫離總體對象獨立存在。在UML中,聚合關係用帶空心菱形的直線表示。例如:汽車發動機(Engine)是汽車(Car)的組成部分,可是汽車發動機能夠獨立存在,所以,汽車和發動機是聚合關係,如圖6所示:

圖6  聚合關係實例

      在代碼實現聚合關係時,成員對象一般做爲構造方法、Setter方法或業務方法的參數注入到總體對象中,圖6對應的Java代碼片斷以下:

[java]  view plain  copy
 
  1. public class Car {  
  2.     private Engine engine;  
  3.   
  4.     //構造注入  
  5.     public Car(Engine engine) {  
  6.         this.engine = engine;  
  7.     }  
  8.       
  9.     //設值注入  
  10. public void setEngine(Engine engine) {  
  11.     this.engine = engine;  
  12. }  
  13. ……  
  14. }  
  15.   
  16. public class Engine {  
  17.     ……  
  18. }  

      (6) 組合關係

      組合(Composition)關係也表示類之間總體和部分的關係,可是在組合關係中總體對象能夠控制成員對象的生命週期,一旦總體對象不存在,成員對象也將不存在,成員對象與總體對象之間具備同生共死的關係。在UML中,組合關係用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,並且若是頭沒了,嘴巴也就沒了,所以頭和嘴巴是組合關係,如圖7所示:

圖7  組合關係實例

      在代碼實現組合關係時,一般在總體類的構造方法中直接實例化成員類,圖7對應的Java代碼片斷以下:

[java]  view plain  copy
 
  1. public class Head {  
  2.     private Mouth mouth;  
  3.   
  4.     public Head() {  
  5.         mouth = new Mouth(); //實例化成員類  
  6.     }  
  7. ……  
  8. }  
  9.   
  10. public class Mouth {  
  11.     ……  
  12. }  
相關文章
相關標籤/搜索