最近在看博客,裏面涉及到很多的類圖,流程圖,雖然說以前學過UML相關的課程,但畢竟過了這麼久了,對這幾種概念早已模糊不清了,所以索性藉着這次看博客的時間,把這幾種概念再重新梳理總結一遍,以備再次查看之用。
一、泛化(Generalization)
泛化,是一種繼承關係, 表示一般與特殊的關係, 它指定了子類如何特化父類的所有特徵和行爲。在Java中此類關係通過關鍵字extends明確標識。
例如:貓是動物的一種, 它既有貓的特性也有動物的共性。
箭頭指向:帶三角箭頭的實線,箭頭指向父類。
二、實現(Realization)
實現,是一種類與接口的關係, 表示類是接口所有特徵和行爲的實現.在Java中此類關係通過關鍵字implements明確標識。
例如:哺乳動物中蝙蝠(對象)會飛(接口),而一般的哺乳動物都不會飛。
箭頭指向:帶三角箭頭的虛線,箭頭指向接口。
三、組合(Composition)
組合是關聯關係的一種特例,他體現的是一種contains-a的關係,這種關係比聚合更強,也稱爲強聚合。它是整體與部分的關係,但部分不能離開整體而單獨存在。
例如:公司和部門是整體和部分的關係,沒有公司就不存在部門。
箭頭指向:帶實心菱形的實線,菱形指向整體。
public class Company
{
private Department mDepartment;
public Company()
{
mDepartment = new Department();
}
......
}
public class Department
{
......
}
四、聚合(Aggregation)
聚合也是關聯關係的一種特例,它體現的是一種has-a的關係,這種關係比依賴強,也是一種整體和部分的關係,但整體與部分是可以分開的,它們擁有各自的生命週期。
例如:如車與輪胎、公司與員工的關係等。
箭頭指向:帶空心菱形的實心線,菱形指向整體。
public class Car
{
private Engine mTyre;
public Car(Tyre tyre)
{
this.mTyre = tyre;
}
}
public void setTyre(Tyre tyre)
{
this.mTyre = tyre;
}
public class Tyre
{
......
}
五、關聯(Association)
關聯是類與類或類與接口之間語義級別的一種強依賴關係,它使一個類知道另一個類的屬性和方法。這種關係一般是長期的,而且雙方的關係一般是平等的、關聯可以是單向的或者雙向的。雙向關聯有兩個箭頭或沒有箭頭,單向關聯有一個箭頭。
例如:老師與學生,我和我的朋友,一名學生需要上多門課程等。
箭頭指向:帶普通箭頭(或實心三角形箭頭)的實心線,指向被關聯元素。
public class Teacher
{
private List<Student> mStudentList;
}
public class Student
{
......
}
代碼中的體現主要是成員變量的關係,爲被關聯類Student以類屬性的形式出現在關聯類Teacher中,當然也可能是關聯類引用了一個類型爲被關聯類的全局變量。
六、依賴(Dependency)
依賴是一種使用關係,即一個類A使用到了另一個類B,而這種使用關係是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A類,它是一種單向關係。
例如:人與車就是一種依賴關係。
箭頭指向:帶箭頭的虛線,指向被依賴元素。
public class Person
{
void buy(Car car)
{
......
}
}
public class Car
{
......
}
依賴在代碼中的體現主要是局部變量、方法的參數或者對靜態方法的調用。描述的是對象之間的調用關係,這一點與關聯不同(關聯描述的是對象之間的結構關係),一般來說要儘量避免雙向依賴。
總結
幾種關係之間的強弱順序爲:
泛化 = 實現 > 組合 > 聚合 > 關聯 > 依賴