UML类图介绍

unified modeling Language(统一建模语言),主要用于对类的关系的建模画图,在设计程序之前画

类的UML画法示例

title:代码
collapse:open
```cpp
class Hunter
{
public:
    int m_age = 32;
    static int m_time;
    string getName()
    {
        return m_name;
    }
    void setName(string name)
    {
        m_name = name;
    }
    static void saySorry()
    {
        string count = to_string(m_time);
        cout << "Sorry to Animal" + count + "times" << endl;
    }
protected:
    string m_name = "nack";
    void aiming()
    {
        cout << "使用" << m_gunName << "瞄准" << endl;
    }
private:
    string m_gunName = "AK-47";
    void shoot()
    {
        cout << "使用" + m_gunName + "射击" << endl;
    }
};
 

UML类图示例

UML类图图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

Hunter

  • m_age:int = 32
  • m_time:int

m_name:string = “jack”

  • m_gunName:string = “AK47”
  • getName():string
  • setName(name:string):void
  • goHunting():void

aiming():void

  • shoot():void
  • saySorry():void
指向原始笔记的链接

解读:

  • + 私有
  • #保护
  • -公有
  • :后加指定 (参数/返回)类型
  • =默认值
  • __下划线(这里用黄色字体表示) 静态类型

类的关系


继承关系

继承也称泛化,用于描述父子类之间的关系,父类又称为基类或超类,子类又称作派生类,在UML中,泛化关系用带空心三角形的实线表示。

继承关系有两种:普通继承和抽象继承,但是UML画法不变。

title:Example
这里设计两个类
`gird`鸟类
`cuckoo`布谷
`eagle`鹰
 

UML类图

继承关系UML类图图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

bird

  • getName():string

  • setName(name:string):void

  • fly(): void

  • eat():void

cuckoo

  • fly(): void
  • eat():void

eagle

  • fly(): void
  • eat():void
指向原始笔记的链接

  • 倾斜字体(用蓝色字体表示) 抽象类成员函数

关联关系

单向关联关系是类与类之间最常用的一种关系,它是一种结构化的关系,表示一个对象与另一个对象之间的联系,如汽车和轮胎,班级和学生等。

用(带箭头或不带箭头的)实现链接有关联关系的类。c++中这种关联关系在类中是这样体现的,通常将一个类的对象作为另一个类的成员变量

类的关联关系有三种,单向关联,双向关联,自关联。

单向关联关系

常见例子: 父类有子类。

title:代码示例
collapse:open
```cpp
class par
{
};
 
class child
{
private:
    par m_farther;
};

Note

单向关联关系图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

parent

child

指向原始笔记的链接

双向关联关系

常见例子:类成员相互包含

title:Example
collapse:open
```cpp
class par
{
    child m_child;
};
 
class child
{
private:
    par m_farther;
};

UML类图

双向关联关系图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

par

child

  • m_child:child

  • m_father:par

or

指向原始笔记的链接

在画UML类图时,没有箭头的实现表示双向关联关系,但是也可以是双向箭头

自关联关系

常见示例:链表

title:代码示例
collapse:open
```cpp
class nodes
{
    nodes *next;
};

UML类图

自关联关系图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

nodes

  • next:nodes*
指向原始笔记的链接

聚合关系

聚合关系表示整体与部分的关系。在聚合关系中,成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。

在UML中,聚合关系用带空心菱形的直线表示。

title:聚合关系Example
collapse:open
- 汽车: 引擎,轮胎,车灯。
- 森林: 植物,动物,水,阳光。
```cpp
class Animal{
 
};
 
class Plant{
 
};
 
class Water{
 
};
 
class Sun{
 
};
 
class Forest{
    Water wt;
    Plant pl;
    Animal an;
    Sunglass sg;
};

UML类图

聚合关系图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

Forest

  • wt:Water
  • pl:Plant
  • an:Animal
  • sg:Sun

Animal

Water

Plant

Sun

指向原始笔记的链接

组合关系

组合关系也表示整体和部分的关系,但是组合对象可以控制整体对象的生命周期,一旦整体对象不存在,整体对象和成员对象之间具有共同生死的关系。

在UML类图中用带实心菱形直线表示。

  • 头,嘴巴,…
  • 树,树干,树枝,树叶,树根
title:组合关系Example
collapse:open
- 汽车: 引擎,轮胎,车灯。
- 森林: 植物,动物,水,阳光。
```cpp
class Root{
 
};
 
class Trunk{
 
};
 
class Branch{
 
};
 
class Leaf{
 
};
 
class Tree{
    Root rt;
    Trunk tk;
    Branch bc;
    Leaf lf;
};

UML类图

组合关系UML图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

Forest

  • rt:Root
  • tk:Trank
  • bc:Branch
  • lf:Leaf

Branch

Leaf

Root

Trank

指向原始笔记的链接

当一个物体既有聚合关系有和组合关系有关,具体问题具体分析

依赖关系

依赖是一种关系,特定时间会影响到该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。

依赖关系大多数情况下体现在某个类方法使用另一个类的对象作为参数。

在UML类图中,依赖关系用带箭头的虚线表示,有依赖的一方指向被依赖的一方。

title:组合关系Example
collapse:open
- 驾驶员开车需要使用车对象的move方法
```cpp
class Car{
public:
    void move(){}
};
 
class Driver{
    void drive(Car car)
    {
        car.move();
    }
};

UML类图

依赖关系图解

⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠

Text Elements

Car

Driver

  • move():void
指向原始笔记的链接

title:Summary
collapse:open
- 将一个类的对象作为另一个类方法的参数
- 在类方法中将另一个类的对象作为其对象的局部变量
- 在一个类的方法中调用另一个类的静态方法

区别

title:Summary
collapse:open
类关系强弱顺序是这样的:
 
继承(泛化) > 组合 > 聚合 > 关联 > 依赖

关联关系两个对象间一般是平等的,聚合是不平等的。

组合对象的生命周期有很大关联。被组合对象创建在组合对象之后销毁在组合对象之前,聚合不是。

一般来说被组合对象不能脱离组合对象独立存在,聚合可以属于多个聚合对象。

下一节 设计模式三原则