類與類之間的關系
1. 關聯關系
關聯(Association)關系是類與類之間最常用的一種關系,它是一種結構化關系,用于表示一類對象與另一類對象之間有聯系,如汽車和輪胎、師傅和徒弟、班級和學生等等。
圖1 關聯關系執行個體
(1) 雙向關聯
預設情況下,關聯是雙向的。例如:顧客(Customer)購買商品(Product)并擁有商品,反之,賣出的商品總有某個顧客與之相關聯。是以,Customer類和Product類之間具有雙向關聯關系,如圖2所示:
圖2 雙向關聯執行個體
(2) 單向關聯
類的關聯關系也可以是單向的,單向關聯用帶箭頭的實線表示。例如:顧客(Customer)擁有位址(Address),則Customer類與Address類具有單向關聯關系,如圖3所示:
圖3 單向關聯執行個體
(3) 自關聯
在系統中可能會存在一些類的屬性對象類型為該類本身,這種特殊的關聯關系稱為自關聯。例如:一個節點類(Node)的成員又是節點Node類型的對象,如圖4所示:
圖4 自關聯執行個體
(4) 多重性關聯
多重性關聯關系又稱為重數性(Multiplicity)關聯關系,表示兩個關聯對象在數量上的對應關系。在UML中,對象之間的多重性可以直接在關聯直線上用一個數字或一個數字範圍表示。
例如:一個界面(Form)可以擁有零個或多個按鈕(Button),但是一個按鈕隻能屬于一個界面,是以,一個Form類的對象可以與零個或多個Button類的對象相關聯,但一個Button類的對象隻能與一個Form類的對象關聯,如圖5所示:
(5) 聚合關系
聚合(Aggregation)關系表示整體與部分的關系。在聚合關系中,成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。
圖6 聚合關系執行個體
(6) 組合關系
組合(Composition)關系也表示類之間整體和部分的關系,但是在組合關系中整體對象可以控制成員對象的生命周期,一旦整體對象不存在,成員對象也将不存在,成員對象與整體對象之間具有同生共死的關系。
圖7 組合關系執行個體
2. 依賴關系
依賴(Dependency)關系是一種使用關系,特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系。大多數情況下,依賴關系展現在某個類的方法使用另一個類的對象作為參數。
圖1 依賴關系執行個體
在系統實施階段,依賴關系通常通過三種方式來實作,第一種也是最常用的一種方式是如圖1所示的将一個類的對象作為另一個類中方法的參數,第二種方式是在一個類的方法中将另一個類的對象作為其局部變量,第三種方式是在一個類的方法中調用另一個類的靜态方法。
3. 泛化關系
泛化(Generalization)關系也就是繼承關系,用于描述父類與子類之間的關系,父類又稱作基類或超類,子類又稱作派生類。
圖2 泛化關系執行個體
4. 接口與實作關系
在很多面向對象語言中都引入了接口的概念,如Java、C#等,在接口中,通常沒有屬性,而且所有的操作都是抽象的,隻有操作的聲明,沒有操作的實作。UML中用與類的表示法類似的方式表示接口,如圖3所示:
圖3 接口的UML圖示
接口之間也可以有與類之間關系類似的繼承關系和依賴關系,但是接口和類之間還存在一種實作(Realization)關系,在這種關系中,類實作了接口,類中的操作實作了接口中所聲明的操作。在UML中,類與接口之間的實作關系用帶空心三角形的虛線來表示。例如:定義了一個交通工具接口Vehicle,包含一個抽象操作move(),在類Ship和類Car中都實作了該move()操作,不過具體的實作細節将會不一樣,如圖4所示: