UML 类图看这篇文章就够了

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 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
讨论数量: 2

类名不能和函数名重复吧

file

4年前 评论

继承和实现的箭头都是空心的哦~~~ 我没找到空心箭头 就画了实心的

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!