UML類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。因此建議你們能夠學習一波UML類圖,對於本身,能夠理清楚本身設計的系統中類與類之間關係。對於其餘人,只須要觀看你的UML類圖就能理解你的設計思路。php
可見性:函數
公有(public) 「+」工具
受保護(protected) 「#」學習
私有(private) 「-」測試
繼承:繼承指的是創建一個新的派生類,從一個或多個先前定義的類中繼承數據和函數,能夠從新定義或加進新數據和函數,從而創建了類的層次或等級。this
<?php
class A {
public $param1;
protected $param2;
private $param3;
public function method1(): string {
return "test code";
}
}
class B extends A {
public $test;
public function method2(int $num): int {
return $num;
}
}
複製代碼
接口實現:實現關係(Implementation),主要用來規定接口和實現類的關係。編碼
<?php
interface animal {
public function move(int $distance);
public function jump(int $height);
}
class cat implements animal {
public function move(int $distance) {
return $distance;
}
public function jump(int $height) {
return $distance;
}
}
class cow implements animal {
public function move(int $distance) {
return $distance;
}
public function jump(int $height) {
return $distance;
}
}
複製代碼
組合關係(Composition):總體與部分的關係,可是總體與部分不能夠分開。spa
組合關係表示類之間總體與部分的關係,總體和部分有一致的生存期。一旦總體對象不存在,部分對象也將不存在,是同生共死的關係。設計
例如:人由頭部和身體組成,二者不可分割,共同存在。 3d
<?php
class Head {
public function eye() {
echo "this is eye";
}
}
class Body {
public function tummy() {
echo "this is tummy";
}
}
class Human {
private $head;
private $body;
public function setHead(Head $head) {
$this->head = $head;
}
public function setBody(Body $body) {
$this->body = $body;
}
public function show() {
$this->head->eye();
echo "<br>";
$this->body->tummy();
}
}
複製代碼
聚合關係(Aggregation):總體和部分的關係,總體與部分能夠分開。
聚合關係也表示類之間總體與部分的關係,成員對象是總體對象的一部分,可是成員對象能夠脫離總體對象獨立存在。
例如:汽車 = 發動機+輪子。當汽車報廢時,發動機和輪子不必定會報廢,可能會進入二手市場。
聚合和組合的關係有點微妙~
<?php
class Engine {
public function getEngine() {
echo "this is Engine";
}
}
class Wheel {
public function getWheel() {
echo "this is getWheel";
}
}
class Car {
private $engine;
private $wheel;
public function setEngine(Engine $engine) {
$this->engine = $engine;
}
public function setWheel(Wheel $wheel) {
$this->wheel = $wheel;
}
public function show() {
$this->engine->getEngine();
echo "<br>";
$this->wheel->getWheel();
}
}
複製代碼
關聯(Association)關係是類與類之間最經常使用的一種關係,它是一種結構化關係,用於表示一類對象與另外一類對象之間有聯繫,如汽車和輪胎、師傅和徒弟、班級和學生等等。
默認狀況下,關聯是雙向的。例如:顧客(Customer)購買商品(Product)並擁有商品,反之,賣出的商品總有某個顧客與之相關聯。所以,Customer類和Product類之間具備雙向關聯關係。
<?php
class Customer {
public $product = [];
}
class Product {
public $customer;
}
複製代碼
類的關聯關係也能夠是單向的,單向關聯用帶箭頭的實線表示。例如:顧客(Customer)擁有地址(Address),則Customer類與Address類具備單向關聯關係。
<?php
class Customer {
public $address = [];
}
class Address {
}
複製代碼
在系統中可能會存在一些類的屬性對象類型爲該類自己,這種特殊的關聯關係稱爲自關聯。例如:單例模式。
<?php
final class Singleton {
/** * @var Singleton */
private static $instance;
/** * 經過懶加載得到實例(在第一次使用的時候建立) */
public static function getInstance(): Singleton {
if (null === static::$instance) {
static::$instance = new static();
}
return static::$instance;
}
/** * 不容許從外部調用以防止建立多個實例 * 要使用單例,必須經過 Singleton::getInstance() 方法獲取實例 */
private function __construct() {
}
/** * 防止實例被克隆(這會建立實例的副本) */
private function __clone() {
}
/** * 防止反序列化(這將建立它的副本) */
private function __wakeup() {
}
}
複製代碼
多重性關聯關係又稱爲重數性(Multiplicity)關聯關係,表示兩個關聯對象在數量上的對應關係。在UML中,對象之間的多重性能夠直接在關聯直線上用一個數字或一個數字範圍表示。
對象之間能夠存在多種多重性關聯關係,常見的多重性表示方式如表1所示:
表示方法 | 多重性說明 |
---|---|
1..1 | 表示另外一個類的一個對象只與該類的一個對象有關係 |
0..* | 表示另外一個類的一個對象與該類的零個或多個對象有關係 |
1..* | 表示另外一個類的一個對象與該類的一個或多個對象有關係 |
0..1 | 表示另外一個類的一個對象沒有或只與該類的一個對象有關係 |
m..n | 表示另外一個類的一個對象與該類最少m,最多n個對象有關係 (m≤n) |
例如:一個界面(Form)能夠擁有零個或多個按鈕(Button),可是一個按鈕只能屬於一個界面,所以,一個Form類的對象能夠與零個或多個Button類的對象相關聯,但一個Button類的對象只能與一個Form類的對象關聯。
<?php
class Form {
private $button = [];
}
class Button {
}
複製代碼
依賴關係(Dependence):假設A類的變化引發了B類的變化,則說名B類依賴於A類。
大多數狀況下,依賴關係體如今某個類的方法使用另外一個類的對象做爲參數。依賴關係是一種「使用」關係,特定事物的改變有可能會影響到使用該事物的其餘事物,在須要表示一個事物使用另外一個事物時使用依賴關係。
例如:例如:駕駛員開車,在Driver類的drive()方法中將Car類型的對象car做爲一個參數傳遞,以便在drive()方法中可以調用car的move()方法,且駕駛員的drive()方法依賴車的move()方法,所以類Driver依賴類Car。
<?php
class Driver {
public function drive(Car $car) {
$car->move();
}
}
class Car {
public function move() {
}
}
複製代碼
最後推薦一款在線畫圖工具: