shenhua969的專欄
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 {
-
……