類圖 是用于描述系統(tǒng)中所包含的類以及它們之間的相互關系,幫助人們簡化對系統(tǒng)的理解,它是系統(tǒng)分析和設計階段的重要產物,也是系統(tǒng)編碼和測試的重要模型依據。學習好類圖的繪制,是一位合格的軟件工程師應有的技能。
1.類的UML圖示
在UML中,類使用包含類名,屬性和方法且?guī)в蟹指艟€的長方形來表示
例如定義一個Person類,包含屬性name,age,擁有eating方法,則UML類圖如下圖示:
對應的java代碼為:
public class Person {
private String name;
private int age;
public void eating() {
......
}
}
在UML類圖中,類一般由三部分組成:
(1) 第一部分是類名:每個類都必須有一個名字,類名是一個字符串。
(2) 第二部分是類的屬性(Attributes):屬性是指類的性質,即類的成員變量。一個類可以有任意多個屬性,也可以沒有屬性。
UML規(guī)定屬性的表示方式為:
可見性 名稱:類型 [=缺省值]
其中:
?“可見性”表示該屬性對于類外的元素而言是否可見,包括公有(public)、私有(private),友好的(friendly,代表package)和受保護(protected)三種,在類圖中分別用符號+、-,~和#表示。
? “名稱”表示屬性名,用一個字符串表示。
? “類型”表示屬性的數據類型,可以是基本數據類型,也可以是用戶自定義類型。
? “缺省值”是一個可選項,即屬性的初始值。
(3) 第三部分是類的操作(Operations):操作是類的任意一個實例對象都可以使用的行為,是類的成員方法。
UML規(guī)定操作的表示方式為:
可見性 名稱(參數列表) [ : 返回類型]
其中:
? “可見性”的定義與屬性的可見性定義相同。
?“名稱”即方法名,用一個字符串表示。
?“參數列表”表示方法的參數,其語法與屬性的定義相似,參數個數是任意的,多個參數之間用逗號“,”隔開。
? “返回類型”是一個可選項,表示方法的返回值類型,依賴于具體的編程語言,可以是基本數據類型,也可以是用戶自定義類型,還可以是空類型(void),如果是構造方法,則無返回類型。
2.類之間的關系
類不是孤立存在的,類與類之間存在各種關系包括:關聯(lián)關系,聚合關系,組合關系,依賴關系,泛化關系。每種關系對應i不同的圖示
(1)依賴關系
依賴關系是類與類之間最弱的關系,是指一個類(依賴類)使用或知道另外一個類(目標類)。它是一個典型的瞬時關系,依賴類和目標類進行簡單的交互,但是依賴類并不維護目標類的對象,僅僅是零時使用而已。例如對于窗體類window,當它關閉時會發(fā)送一個類windowclosingevent對象,這里也就可以說窗體類window使用了類windowclosingevent,他們之間的依賴關系如下圖示:
依賴關系用虛線箭頭表示
(2)關聯(lián)關系
關聯(lián)關系是一種比依賴關系更強的關系,是指一個類“擁有”另一個類,表示類之間的一種持續(xù)一段時間的合作關系,包括有單向關聯(lián)和雙向關聯(lián)關系。
單向關聯(lián):類A與類B是單向關聯(lián)關系,是指類A包含類B對象的引用,但是類B并不包含類A對象的引用,例如銀行用戶類(client)包含賬戶類(Bankacount)的引用,但是反過來卻不是。在類圖中,通過從類A畫一條帶箭頭的單向實線到類B來表示他們之間的單項關聯(lián)關系,箭頭方向指向B。如下圖:
在上圖中,連接兩個類的箭頭線兩頭的數字即代表它們之間的數量關系,例如上圖,代表一個client類包含了0到多個BankAcount類的引用,并且BankAcount類在client中的引用是私有變量:accounts.
表達數量的形式有:
表達方式 | 數量說明 |
---|---|
1..1 | 表示另一個類的一個對象只與該類的一個對象有關系 |
0..* | 表示另一個類的一個對象與該類的零個或多個對象有關系 |
1..* | 表示另一個類的一個對象與該類的一個或多個對象有關系 |
0..1 | 表示另一個類的一個對象沒有或只與該類的一個對象有關系 |
m..n | 表示另一個類的一個對象與該類最少m,最多n個對象有關系 (m≤n |
雙向關聯(lián):類A與類B如果包含對方的引用,則稱類A與類B是雙向關聯(lián)的關系。例如,在一個需求描述中,一個學生(student)可以擁有其選秀的六門課程的信息,一門課程(course)可以包含選修該門課程的任意多個學生的信息。如下圖:
雙向關聯(lián)用雙向箭頭連接兩個類
(3)聚合關系
聚合(Aggregation)關系表示整體與部分的關系。在聚合關系中,成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。在UML中,聚合關系用帶空心菱形的直線表示。例如:汽車發(fā)動機(Engine)是汽車(Car)的組成部分,但是汽車發(fā)動機可以獨立存在,因此,汽車和發(fā)動機是聚合關系,如下圖所示:
在代碼實現聚合關系時,成員對象通常作為構造方法、Setter方法或業(yè)務方法的參數注入到整體對象中:
public class Car {
private Engine engine;
//構造注入
public Car(Engine engine) {
this.engine = engine;
}
//設值注入
public void setEngine(Engine engine) {
this.engine = engine;
}
……
}
public class Engine {
……
}
(4)組合關系
組合(Composition)關系也表示類之間整體和部分的關系,但是在組合關系中整體對象可以控制成員對象的生命周期,一旦整體對象不存在,成員對象也將不存在,成員對象與整體對象之間具有同生共死的關系。在UML中,組合關系用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關系,如下圖所示:
在代碼實現組合關系時,通常在整體類的構造方法中直接實例化成員類
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth(); //實例化成員類
}
……
}
public class Mouth {
……
}
(5)泛化關系
泛化(Generalization)關系也就是繼承關系,用于描述父類與子類之間的關系,父類又稱作基類或超類,子類又稱作派生類。在UML中,泛化關系用帶空心三角形的直線來表示,如下圖:
***在UML中,類與接口之間的實現關系用帶空心三角形的虛線來表示接口實現關系