Java類之間的關聯關係(轉載)

Java類之間的關聯關係

UML類圖中的關係分爲四種:泛化、依賴、關聯、實現;關聯關係又能夠細化爲聚合和組合。
1、泛化(Generalization)
泛化是父類和子類之間的關係,子類繼承父類的全部結構和行爲。在子類中能夠增長新的結構和行爲,也能夠覆寫父類的行爲。
通常用一個帶空心箭頭的實線表示泛化關係,UML圖以下:

工具

泛化對應Java中繼承關係,即子類繼承父類中出private修飾外的全部東西(變量、方法等)。示例代碼:
public class Animal {
}
public class Tiger extends Animal {
}
Tiger繼承Animal,所以Tiger與Animal之間是泛化(繼承)關係。這個很好理解。

2、依賴(Dependency)
依賴關係是一種使用關係,特定事物的改變有可能會影響到使用該事物的事物,反之不成立。在你想顯示一個事物使用另外一個事物時使用。
通常用一條指向被依賴事物的虛線表示,UML圖以下:


一般狀況下,依賴關係體如今某個類的方法使用另外一個類做爲參數。代碼示例:spa

public class Screwdriver {    //螺絲刀,做爲人類的工具,是用來被人類使用的
}
public class Person{
       public void screw(Screwdriver src){    //擰螺絲,需使用螺絲刀
}
}

Person類的screw()方法在使用時就得傳入一個Screwdriver類型的參數,這樣Screwdriver的改變就會影響到Person,所以Person與Screwdriver之間就是依賴關係(Person依賴於Screwdriver)。
3、關聯(Association)
是一種結構關係,說明一個事物的對象與另外一個事物的對象相聯繫。給定有關聯的兩個類,能夠從 一個類的對象獲得另外一個類的對象。關聯有兩元關係和多元關係。兩元關係是指一種一對一的關係,多元關係是一對多或多對一的關係。兩個類之間的簡單關聯表示 了兩個同等地位類之間的結構關係。當你想要表示結構化關係時使用關聯。(能夠想一想Hibernate的關聯關係)
通常用實線鏈接有關聯的同一個類或不一樣的兩個類。UML圖以下:

.net

一般狀況下,關聯關係是經過類的成員變量來實現的。代碼示例:
public class Company {   //公司
private Employee emp ;  //一個公司僱員,公司與僱員之間就是一種關聯關係。
}
public class Employee{
}
僱員做爲公司的屬性,不一樣於上面的依賴。依賴的話,僱員的改變會影響公司,顯然不是。在這裏僱員僅僅做爲公司的一個屬性而存在。所以Employee與Company之間是關聯關係。關聯關係還能夠細分爲聚合和組合兩種。

3.1  聚合(Aggregation)對象

聚合是一種特殊的關聯。它描述了「has a」關係,表示總體對象擁有部分對象。
關 聯關係和聚合關係來語法上是沒辦法區分的,從語義 上才能更好的區分二者的區別。聚合是較強的關聯關係,強調的是總體與部分 之間的關係。例如,學校和學生的關係。聚合的總體和部分之間在生命週期上沒有什麼必然的聯繫,部分對象能夠在總體對象建立以前建立,也能夠在總體對象銷燬 以後銷燬。
通常用帶一個空心菱形(總體的一端-學校)的實線表示。UML圖以下:

 

與關聯關係同樣,聚合關係也是經過類的成員變量來實現的。示例代碼:
public class Student{
}
public class School{  
       private List<Student> students ;  //學校與學生是聚合關係
}

學校是總體,而學生是部分。學校與學生都是能夠獨立存在的,之間沒有什麼必然的聯繫。所以學校與學生就是聚合關係。
3.2  組合(Composition)blog

組合是聚合的一種形式,它具備更強的擁有關係,強調總體與部分的生命週期是一致的,總體負責部分的生命週期的管理。 生命週期一致指的是部分必須在組合建立的同時或者以後建立,在組合銷燬以前或者同時銷燬,部分的生命週期不會超出組合的生命週期。例如Windows的窗 口和窗口上的菜單就是組合關係。若是總體被銷燬,部分也必須跟着一塊兒被銷燬,若是全部者被複制,部分也必須一塊兒被複制。
通常用帶實心菱形(總體的一端)的實線來表示。UML圖以下:
與關聯關係同樣,組合關係也是經過類的成員變量 來實現的。示例代碼:
public class Menu{
}
public class Window{
       private List<Menu> menus ;
}
菜單的存在前提是窗口的存在,二者之間存在很強的擁有關係。且窗口對菜單的生命週期負責,只有在窗口建立以後,菜單纔可以建立,菜單必須在窗口銷燬以前銷燬。所以Window與Menu之間是組合關係。
聚合和組合的區別在於:
聚 合關係是「has-a」關係,組合關係是「contains-a」關係;聚合關係表示總體與部分的關係比較弱,而組合比較強;聚合關係中表明部分事物的對 象與表明聚合事物的對象的生存期無關,一旦刪除了聚合對象不必定就刪除了表明部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了表明部分事物的對 象。
另外有一個差異是組合中的一個對象在同一時刻只能屬於一個組合對象,而聚合的一個部分對象能夠被多個總體對象聚合,例如一個學生能夠在多個學校就讀,而一個菜單在同一時刻只能是某個窗口內的對象。

4、實現(Realization)
實現關係指定兩個實體之間的一個合約。換言之,一個實體定義一個合約,而另外一個實體保證履行該合約。對類來講,就是一個類實現了一個接口。
通常用一條指向接口的虛線表示,UML圖以下:


實現對應Java中的實現接口(implements)。示例代碼:
public interface Person{
}
public class Student implements Person{
}
這個和泛化同樣很好理解。
5、總結
類間關係有不少種,在大的類別上能夠分爲兩種:縱向關係、橫向關係。縱向關係就是繼承關係,它的概念很是明確,也成爲OO的三個重要特徵之一,這裏不過多的討論。
橫向關係較爲微妙,按照UML的建議大致上能夠分爲四種:
依賴    (Dependency)
關聯    (Association)
聚合    (Aggregation)
組合    (Composition)
關於關聯,聚合,組合在實現上並無顯著區別,相區別他們只有經過判斷關係雙方之間的實際關係,如關係強弱、建立與銷燬之間有無必要關聯等。
它們的強弱關係是沒有異議的:依賴 < 關聯 < 聚合 < 組合<泛化(繼承)
實現方式區別:
(1)    依賴關係:關係對象出如今局部變量或者方法的參數裏,或者關係類的靜態方法被調用
(2)    關聯關係:關係對象出如今實例變量中
(3)    聚合關係:關係對象出如今實例變量中
(4)    合成關係:關係對象出如今實例變量中
(5)    Generalization: extends
(6)    實現: implements

原文出處:http://blog.csdn.net/hqshaozhu/article/details/7583545繼承

相關文章
相關標籤/搜索