UML類圖中類之間的6種關係與區別
原文:https://blog.csdn.net/it_zjyang/article/details/51355062
兩個類之間的關係分為兩種,一種是強關聯一種是弱關聯,強關聯是在編譯時期就已經確定的,無法在執行時期動態的改變的關聯;弱關聯是可以動態地確定並且可以在執行時期動態改變的關聯。顯然,Java中繼承是強關聯而聚合是弱關聯。
類與類之間的關係可以根據關係的強度依次分為以下五種:
依賴關係(Dependency)---關聯關係(Association)---聚合(Aggregation)---組合(Composition)---實現(implements)==泛化(Generalization)
依賴關係
依賴關係是五種關係中耦合最小的一種關係。使用虛線加箭頭表示,如下圖所示:程式碼:
- publicclass Person {
- publicvoid Call(){
- Phone phone = new Phone();
- }
- }
- publicclass Phone {
- }
解釋:Person 和 Phone之間是沒有關係的,但是由於偶爾的需要,Person需要使用Phone,在Person類中的具體方法中需要例項化Phone,這時Person就依賴於Phone.持有Phone類的是Person類的一個方法,而不是Person類,這點是最重要的。
關聯關係
關聯關係是實線加箭頭表示。表示類之間的關係比依賴要強,如下圖所示:程式碼:
- public
- //頭部是人的一個屬性
- public Head head;
- public Person() {
- // TODO Auto-generated constructor stub
- }
- }
- publicclass Head {
- public Head() {
- // TODO Auto-generated constructor stub
- }
- }
解釋:Head是作為Person類的一個內部屬性來使用,一旦例項化了Person類,同時也例項化了一個Head例項,所以他們的依賴性更強。與關聯最大的區別是:依賴時是在類的內部具體方法中使用到另外一個類,而關聯則是作為內部屬性來用,依賴關係僅當具體方法被呼叫時才會例項化,比如剛才的Person只有打電話時才呼叫Phone例項化,而關聯是在new一個Person時就同時例項化了一個Head類來作為Person的內部屬性.
聚合關係
聚合關係通過一個空心的菱形加箭頭表示,如下圖所示:程式碼:
- publicclass PersonGroup {
- public Person person;
- //將person作為構造方法的引數傳進去
- public PersonGroup(Person person) {
- // TODO Auto-generated constructor stub
- this.person = person;
- }
- }
- publicclass Person {
- public Person() {
- // TODO Auto-generated constructor stub
- }
- }
解釋:Person類是PersonGroup構造方法的引數,因此可以Person類可以完全脫離PersonGroup類而存在,不會因為PersonGroup例項的消亡而消亡,就像現實生活中,人不會因為脫離人群就掛了...
組合關係
組合關係通過一個實心的菱形加箭頭表示,如下圖所示:程式碼:
- publicclass Person {
- public Foot foot;
- public Person() {
- // TODO Auto-generated constructor stub
- //在構造方法中例項化
- foot = new Foot();
- }
- }
- publicclass Foot {
- public Foot() {
- // TODO Auto-generated constructor stub
- }
- }
解釋: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.綜合比較
除了繼承和實現這兩種,剩下的四種關係都是語義級別的,所以從程式碼層面並不能完全區分各種關係,可以說都是關聯關係,只不過有強弱之分;
但總的來說,後幾種關係所表現的強弱程度依次為:
組合>聚合>關聯>依賴;