UML 類圖看這篇文章就夠了

boring發表於2019-06-25

UML類圖是什麼以及它的作用?

UML類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。所以建議大家可以學習一波UML類圖,對於自己,可以理清楚自己設計的系統中類與類之間關係。對於其他人,只需要觀看你的UML類圖就能理解你的設計思路。

UML類圖可見性符號的表示

可見性:

公有(public) “+”

受保護(protected) “#”

私有(private) “-”

類與類之間的關係主要有六種:繼承、實現、組合、聚合、關聯和依賴,這六種關係的箭頭表示都不一樣

繼承關係

繼承:繼承指的是建立一個新的派生類,從一個或多個先前定義的類中繼承資料和函式,可以重新定義或加進新資料和函式,從而建立了類的層次或等級。

<?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):整體與部分的關係,但是整體與部分不可以分開。

組合關係表示類之間整體與部分的關係,整體和部分有一致的生存期。一旦整體物件不存在,部分物件也將不存在,是同生共死的關係。

例如:人由頭部和身體組成,兩者不可分割,共同存在。

<?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)關係是類與類之間最常用的一種關係,它是一種結構化關係,用於表示一類物件與另一類物件之間有聯絡,如汽車和輪胎、師傅和徒弟、班級和學生等等。

(1)雙向關聯

預設情況下,關聯是雙向的。例如:顧客(Customer)購買商品(Product)並擁有商品,反之,賣出的商品總有某個顧客與之相關聯。因此,Customer類和Product類之間具有雙向關聯關係。

<?php

class Customer
{
    public $product = [];
}

class Product
{
    public $customer;
}

(2)單向關聯

類的關聯關係也可以是單向的,單向關聯用帶箭頭的實線表示。例如:顧客(Customer)擁有地址(Address),則Customer類與Address類具有單向關聯關係。

<?php

class Customer
{
    public $address = [];
}

class Address
{

}

(3)自關聯

在系統中可能會存在一些類的屬性物件型別為該類本身,這種特殊的關聯關係稱為自關聯。例如:單例模式。

<?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()
    {
    }
}

(4)多重性關聯

多重性關聯關係又稱為重數性(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()
    {

    }
}

結語

最後推薦一款線上畫圖工具:

processon.com

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章