UML 類圖常見關係總結
UML 中常見的關係類型如下:
- 泛化 - Generalization
- 實現 - Realization
- 關聯 - Association
- 聚合 - Aggregation
- 組合 - Composition
- 依賴 - Dependency
1、泛化 (Generalization)
【泛化關係】繼承關係,用於描述父類與子類間的關係。
【圖標標示】帶空心三角形箭頭的實線,由子類指向父類。
上圖中,鳥類繼承於動物類,利用代碼描述則如下:
//父類
class Aminal {
public $life;
public function breed () {
echo "繁殖";
}
}
//子類
class Bird extends Aminal {
public $feather;
public function layEggs () {
echo "產蛋";
}
}
2、實現 (Realization)
【實現關係】一種類與接口的關係,表示類是接口所有特徵和行爲的實現。
【圖標標示】帶空心三角形箭頭的虛線,箭頭指向接口。
上圖中,大雁類實現飛翔接口的操作,利用代碼描述則爲:
interface Fly {
public funtion fly ();
}
class WildGoose implements Fly {
public function fly () {
echo "飛翔";
}
public function layEggs () {
echo "下大雁蛋";
}
}
3、關聯 (Association)
【關聯關係】一種擁有關係,指一個類知道另一個類的屬性和方法。
【代碼體現】通常將一個類的對象作爲另一個類的成員變量。
【圖標標示】用實線連接有關聯關係的對象所對應的類。可以是有雙向箭頭、單向箭頭或者沒有箭頭的實線。
下圖中,企鵝擁有地點類,地點作爲棲息地,是企鵝類的屬性。
上述圖用代碼描述則爲:
public class Penguin {
private Place home;
...
}
public class Place {
public char name;
...
}
上述實際上是單向關聯,其實還有雙向關聯、自關聯、多重關聯幾個概念。
雙向關聯
默認情況下,關聯是雙向的。例如顧客購買商品並擁有商品,反之,賣出的商品總有某個顧客與之關聯。
自關聯
系統中可能存在一些類的屬性對象爲該類自身,這種特殊的關聯關係稱爲自關聯。例如一個節點類(Node)的成員又是節點 Node 類型的對象。
多重關聯
多重性關聯關係表示兩個關聯對象在數量上的對應關係。在 UML 中,對象之間的多重性可以直接在關聯直線上用一個數字或一個數字範圍表示。
對象間的多重性關聯關係表示方法如下表所示:
表示方式 | 多重性說明 |
---|---|
1..1 | 表示另一個類的一個對象只與該類的一個對象有關係 |
0..* | 表示另一個類的一個對象與該類的零個或多個對象有關係 |
1..* | 表示另一個類的一個對象與該類的一個或多個對象有關係 |
0..1 | 表示另一個類的一個對象沒有或只與該類的一個對象有關係 |
m..n | 表示另一個類的一個對象與該類最少m,最多n個對象有關係(m <= n) |
4、聚合關係
【聚合關係】整體與部分的關係,且部分可以離開整體單獨存在。如雁羣和大雁,大雁離開雁羣仍可以存在。
【代碼體現】成員對象通常作爲構造方法、Setter方法或者業務方法的參數注入到整體對象中。
【圖標標示】帶空心菱形的實心線,菱形指向整體。
上述大雁與雁羣的聚合關係,用代碼表示則如下:
//雁羣
class WildGooseGroup {
private $wildGooseArray;
//採用構造函數參數注入大雁
public function __construct (WildGoose $wildGoose) {
$this->wildGooseArray[] = $wildGoose;
}
}
//大雁
class WildGoose implements Fly {
public function fly () {
echo "飛翔";
}
public function layEggs () {
echo "下大雁蛋";
}
}
5、組合關係
【組合關係】整體與部分的關係,但是部分不能離開整體而單據存在。如鳥和翅膀一樣,沒有了鳥就沒有翅膀。
【代碼體現】通常在整體類的構造方法裏直接實例化成員類。
【圖標標示】帶實心菱形的實線,菱形指向整體。
上述鳥與翅膀的組合關係,利用代碼描述則如下:
//鳥
class Bird extends Aminal {
public $feather;
public $winds;
public function __construct () {
//類的構造函數裏直接實例化
$this->winds[] = new Wind();
$this->winds[] = new Wind();
}
public function layEggs () {
echo "產蛋";
}
}
//翅膀
class Wind {
...
}
6、依賴關係
【依賴關係】一種使用的關係,即一個類的實現需要另一個類的協助,要儘量不要使用雙向的互相依賴。
【代碼體現】局部變量、方法的參數或者對靜態方法的調用。
【圖標表示】帶箭頭的虛線,指向被使用者。
上述依賴關係,利用代碼表示則如下:
class Aminal {
public $life;
public function breed () {
echo "繁殖";
}
//通過方法的參數產生依賴
public function breed (Water $water, Air $air) {
echo "新陳代謝";
}
}
class Water {
...
}
class Air {
...
}
7、總結
組合與聚合實際上是關聯關係中的兩種。關聯關係的強弱如下:
泛化 = 實現 > 組合 > 聚合 > 關聯 > 依賴
下面這 UML 圖,比較形象的展示了各種類關係:
參考
UML類圖幾種關係的總結
深入淺出UML類圖
上述所有圖片均採用 Enterprise Architect 繪製,感興趣的可以研究下。