1. 程式人生 > >UML類圖中類之間的6種關係與區別

UML類圖中類之間的6種關係與區別

原文:https://blog.csdn.net/it_zjyang/article/details/51355062

兩個類之間的關係分為兩種,一種是強關聯一種是弱關聯,強關聯是在編譯時期就已經確定的,無法在執行時期動態的改變的關聯;弱關聯是可以動態地確定並且可以在執行時期動態改變的關聯。顯然,Java中繼承是強關聯而聚合是弱關聯。

類與類之間的關係可以根據關係的強度依次分為以下五種:


依賴關係(Dependency)---關聯關係(Association)---聚合(Aggregation)---組合(Composition)---實現(implements)==泛化(Generalization)

依賴關係

依賴關係是五種關係中耦合最小的一種關係。使用虛線加箭頭表示,如下圖所示:


程式碼:

  1. publicclass Person {  
  2.     publicvoid Call(){  
  3.         Phone phone = new Phone();  
  4.     }  
  5. }  

  1. publicclass Phone {  
  2. }  


解釋:Person 和 Phone之間是沒有關係的,但是由於偶爾的需要,Person需要使用Phone,在Person類中的具體方法中需要例項化Phone,這時Person就依賴於Phone.持有Phone類的是Person類的一個方法,而不是Person類,這點是最重要的。

關聯關係

關聯關係是實線加箭頭表示。表示類之間的關係比依賴要強,如下圖所示:

程式碼:
  1. public
    class Person {  
  2.     //頭部是人的一個屬性
  3.     public Head head;  
  4.     public Person() {  
  5.         // TODO Auto-generated constructor stub
  6.     }  
  7. }  

  1. publicclass Head {  
  2.     public Head() {  
  3.         // TODO Auto-generated constructor stub
  4.     }  
  5. }  


解釋:Head是作為Person類的一個內部屬性來使用,一旦例項化了Person類,同時也例項化了一個Head例項,所以他們的依賴性更強。與關聯最大的區別是:依賴時是在類的內部具體方法中使用到另外一個類,而關聯則是作為內部屬性來用,依賴關係僅當具體方法被呼叫時才會例項化,比如剛才的Person只有打電話時才呼叫Phone例項化,而關聯是在new一個Person時就同時例項化了一個Head類來作為Person的內部屬性.

聚合關係

聚合關係通過一個空心的菱形加箭頭表示,如下圖所示:
程式碼:
  1. publicclass PersonGroup {  
  2.     public Person person;  
  3.     //將person作為構造方法的引數傳進去
  4.     public PersonGroup(Person person) {  
  5.         // TODO Auto-generated constructor stub
  6.         this.person = person;  
  7.     }  
  8. }  

  1. publicclass Person {  
  2.     public Person() {  
  3.         // TODO Auto-generated constructor stub
  4.     }  
  5. }  


解釋:Person類是PersonGroup構造方法的引數,因此可以Person類可以完全脫離PersonGroup類而存在,不會因為PersonGroup例項的消亡而消亡,就像現實生活中,人不會因為脫離人群就掛了...

組合關係

組合關係通過一個實心的菱形加箭頭表示,如下圖所示:
程式碼:
  1. publicclass Person {  
  2.     public Foot foot;  
  3.     public Person() {  
  4.         // TODO Auto-generated constructor stub
  5.         //在構造方法中例項化
  6.         foot = new Foot();  
  7.     }  
  8. }  

  1. publicclass Foot {  
  2.     public Foot() {  
  3.         // TODO Auto-generated constructor stub
  4.     }  
  5. }  


解釋:Foot類是在Person類的構造方法中才被具體例項化,一旦Person例項生成,則Foot例項也生成,當Person例項消亡,其Foot例項也消亡,就像現實生活中,生成一個人,並定會伴隨著腳的生成,但是如果那個人掛了,它的腳自然而然也就...(怎麼聽著怪怪-.-)

實現關係

是一種類與介面的關係,表示類是介面所有特徵和行為的實現.,如下圖所示:

帶三角箭頭的虛線,箭頭指向介面


泛化關係

泛化關係通常包含類與類之間的繼承關係和類與介面實現關係,如下圖所示:繼承:
介面:
總結:以前一直對它們之間的區別模模糊糊,通過查閱和總結寫出來的個人經驗,希望對大家的理解也有所幫助。

他們之間的區別:

對於繼承、實現這兩種關係沒多少疑問,他們體現的是一種類與類、或者類與介面間的縱向關係;其他的四者關係則體現的是類與類、或者類與介面間的引用、橫向關係,是比較難區分的,有很多事物間的關係要想準備定位是很難的,前面也提到,這幾種關係都是語義級別的,所以從程式碼層面並不能完全區分各種關係;

1.聚合與組合

(1)聚合與組合都是一種結合關係,只是額外具有整體-部分的意涵。

(2)部件的生命週期不同

聚合關係中,整件不會擁有部件的生命週期,所以整件刪除時,部件不會被刪除。再者,多個整件可以共享同一個部件。 
組合關係中,整件擁有部件的生命週期,所以整件刪除時,部件一定會跟著刪除。而且,多個整件不可以同時間共享同一個部件。

(3)聚合關係是“has-a”關係,組合關係是“contains-a”關係。

2.關聯和聚合

(1)表現在程式碼層面,和關聯關係是一致的,只能從語義級別來區分。

(2)關聯和聚合的區別主要在語義上,關聯的兩個物件之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的。

(3)關聯是一種結構化的關係,指一種物件和另一種物件有聯絡。

(4)關聯和聚合是視問題域而定的,例如在關心汽車的領域裡,輪胎是一定要組合在汽車類中的,因為它離開了汽車就沒有意義了。但是在賣輪胎的店鋪業務裡,就算輪胎離開了汽車,它也是有意義的,這就可以用聚合了。

3.關聯和依賴

(1)關聯關係中,體現的是兩個類、或者類與介面之間語義級別的一種強依賴關係,比如我和我的朋友;這種關係比依賴更強、不存在依賴關係的偶然性、關係也不是臨時性的,一般是長期性的,而且雙方的關係一般是平等的。

(2)依賴關係中,可以簡單的理解,就是一個類A使用到了另一個類B,而這種使用關係是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A,是一種弱的關聯關係。

4.綜合比較

除了繼承和實現這兩種,剩下的四種關係都是語義級別的,所以從程式碼層面並不能完全區分各種關係,可以說都是關聯關係,只不過有強弱之分

但總的來說,後幾種關係所表現的強弱程度依次為:

組合>聚合>關聯>依賴;