類與類之間的關係(1)
在軟件系統中,類並不是孤立存在的,類與類之間存在各種關係,對於不同類型的關係,UML提供了不同的表示方式。
1. 關聯關係
關聯(Association)關係是類與類之間最常用的一種關係,它是一種結構化關係,用於表示一類對象與另一類對象之間有聯繫,如汽車和輪胎、師傅和徒弟、班級和學生等等。在UML類圖中,用實線連接有關聯關係的對象所對應的類,在使用Java、C#和C++等編程語言實現關聯關係時,通常將一個類的對象作爲另一個類的成員變量。在使用類圖表示關聯關係時可以在關聯線上標註角色名,一般使用一個表示兩者之間關係的動詞或者名詞表示角色名(有時該名詞爲實例對象名),關係的兩端代表兩種不同的角色,因此在一個關聯關係中可以包含兩個角色名,角色名不是必須的,可以根據需要增加,其目的是使類之間的關係更加明確。
如在一個登錄界面類LoginForm中包含一個JButton類型的註冊按鈕loginButton,它們之間可以表示爲關聯關係,代碼實現時可以在LoginForm中定義一個名爲loginButton的屬性對象,其類型爲JButton。如圖1所示:
圖1 關聯關係實例
圖1對應的Java代碼片段如下:
public class LoginForm {
private JButton loginButton; //定義爲成員變量
……
}
public class JButton {
……
}
在UML中,關聯關係通常又包含如下幾種形式:
(1) 雙向關聯
默認情況下,關聯是雙向的。例如:顧客(Customer)購買商品(Product)並擁有商品,反之,賣出的商品總有某個顧客與之相關聯。因此,Customer類和Product類之間具有雙向關聯關係,如圖2所示:
圖2 雙向關聯實例
圖2對應的Java代碼片段如下:
public class Customer {
private Product[] products;
……
}
public class Product {
private Customer customer;
……
}
(2) 單向關聯
類的關聯關係也可以是單向的,單向關聯用帶箭頭的實線表示。例如:顧客(Customer)擁有地址(Address),則Customer類與Address類具有單向關聯關係,如圖3所示:
圖3 單向關聯實例
圖3對應的Java代碼片段如下:
public class Customer {
private Address address;
……
}
public class Address {
……
}
(3) 自關聯
在系統中可能會存在一些類的屬性對象類型爲該類本身,這種特殊的關聯關係稱爲自關聯。例如:一個節點類(Node)的成員又是節點Node類型的對象,如圖4所示:
圖4 自關聯實例
圖4對應的Java代碼片段如下:
public class Node {
private Node subNode;
……
}
(4) 多重性關聯
多重性關聯關係又稱爲重數性(Multiplicity)關聯關係,表示兩個關聯對象在數量上的對應關係。在UML中,對象之間的多重性可以直接在關聯直線上用一個數字或一個數字範圍表示。
對象之間可以存在多種多重性關聯關係,常見的多重性表示方式如表1所示:
表1 多重性表示方式列表
表示方式 |
多重性說明 |
1..1 |
表示另一個類的一個對象只與該類的一個對象有關係 |
0..* |
表示另一個類的一個對象與該類的零個或多個對象有關係 |
1..* |
表示另一個類的一個對象與該類的一個或多個對象有關係 |
0..1 |
表示另一個類的一個對象沒有或只與該類的一個對象有關係 |
m..n |
表示另一個類的一個對象與該類最少m,最多n個對象有關係 (m≤n) |
例如:一個界面(Form)可以擁有零個或多個按鈕(Button),但是一個按鈕只能屬於一個界面,因此,一個Form類的對象可以與零個或多個Button類的對象相關聯,但一個Button類的對象只能與一個Form類的對象關聯,如圖5所示:
圖5 多重性關聯實例
圖5對應的Java代碼片段如下:
public class Form {
private Button[] buttons; //定義一個集合對象
……
}
public class Button {
……
}
(5) 聚合關係
聚合(Aggregation)關係表示整體與部分的關係。在聚合關係中,成員對象是整體對象的一部分,但是成員對象可以脫離整體對象獨立存在。在UML中,聚合關係用帶空心菱形的直線表示。例如:汽車發動機(Engine)是汽車(Car)的組成部分,但是汽車發動機可以獨立存在,因此,汽車和發動機是聚合關係,如圖6所示:
圖6 聚合關係實例
在代碼實現聚合關係時,成員對象通常作爲構造方法、Setter方法或業務方法的參數注入到整體對象中,圖6對應的Java代碼片段如下:
public class Car {
private Engine engine;
//構造注入
public Car(Engine engine) {
this.engine = engine;
}
//設值注入
public void setEngine(Engine engine) {
this.engine = engine;
}
……
}
public class Engine {
……
}
(6) 組合關係
組合(Composition)關係也表示類之間整體和部分的關係,但是在組合關係中整體對象可以控制成員對象的生命週期,一旦整體對象不存在,成員對象也將不存在,成員對象與整體對象之間具有同生共死的關係。在UML中,組合關係用帶實心菱形的直線表示。例如:人的頭(Head)與嘴巴(Mouth),嘴巴是頭的組成部分之一,而且如果頭沒了,嘴巴也就沒了,因此頭和嘴巴是組合關係,如圖7所示:
圖7 組合關係實例
在代碼實現組合關係時,通常在整體類的構造方法中直接實例化成員類,圖7對應的Java代碼片段如下:
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth(); //實例化成員類
}
……
}
public class Mouth {
……
}