title: UML学习记录
date: 2024-06-29 17:39:27

tags: [UML, 工作技能, 基本功]

0/什么是UML?

UML——Unified modeling language UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果.

UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等

1/UML的分类

1.1/UML图

UML图本质上是将你的想法转述给别人,所以主要分为以下几类:

  • 用例图
  • 静态结构图:类图、对象图、包图、组件图、部署图
  • 动态行为图:交互图(时序图与协作图)、状态图、活动图

类图是用来描述类与类之间的关系的,所以是UML图中最核心的。

1.2/UML类图

类图用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系,类之间的关系有:

  • 依赖
  • 泛化(继承)
  • 实现
  • 关联
  • 聚合与组合

所以类图可以用以下例子来解释

public class Person {
    private Integer id;
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

用类图就可以表示为

用UML表示上面的代码

2/类图关系

2.0/类图关系概述

  • 设计一个类中的信息和行为要实现高内聚
  • 设计多个类,类之间要做到低耦合

在实际的系统应用中,我们所创建的多个对象往往是有联系的, 通常情况下对象之间的关系可以分为以下几类:

  • 泛化关系
  • 实现关系
  • 依赖关系
  • 关联关系
  • 聚合关系
  • 组合关系

2.1/泛化(继承)关系

简单的说,泛化就是继承,即一个类(我们称之为子类,子接口)继承(extend)另外一个类(我们称之为父类,父接口)的功能,并且可以增加自己额外的一些功能。

在UML关系中,继承通常使用空心三角+实线表示.

接口间的继承关系通常用圆心表示,而类之间的继承关系通常用矩形表示

UML表示类的继承

2.2/实现关系

在UML关系中,实现通常使用空心三角+虚线表示

表示一个类实现一个或多个接口的功能

UML表示类的实现

2.3/依赖关系

在UML关系中,依赖常用虚线箭头表示

表示一个类依赖于另一个类的定义,表示如果A对象离开了B对象,A对象无法通过编译,则此时A对象依赖于B对象(A类中使用到了B对象)

public class Weapon {
    public float damage;
}

public class Player {
    public Weapon weapon = null;
    public float damage;
    public float hp;

    public void Attack(Player target) {
        if (weapon != null) {
            target.hp -= weapon.damage + damage;
        }else{
            target.hp -= damage;
        }
    }
}

UML表示类的依赖

2.4/关联关系

UML关系中,关联关系通常使用实线箭头表示

2.4.1/一对一关系

{% note info %}
单向关联
{% endnote %}

public class QQNumber{
    public QQZone zone;
}

public class QQZone{}

单向一对一

{% note info %}
双向关联
{% endnote %}

public class QQNumber{
    public QQZone zone;
}

public class QQZone{
    public QQNumber number;
}

双向一对一

2.4.2/单向的一对多

{% note info %}
一个A对象属于多个B对象,并且每个B对象只能属于一个A对象
{% endnote %}

public class Employee{

}

public class Department{
    public List<Employee> emps = new List<Employee>();
}

单向一对多

2.4.3/单向的多对一

{% note info %}
多个A对象属于一个B对象,并且每个A对象只能属于一个B对象
{% endnote %}

public class Department{

}

public class Employee{
    public Department dept;
}

单向多对一

2.4.4/双向一对多,多对一

{% note info %}
A可以通过属性导航到B,B可以通过属性导航到A,本质上是把两个单向关系组合起来
{% endnote %}

public class Employee{
    private Department dept;
}

public class Department{
    private List<Employee> emps = new List<Employee>();
}

双向关系

2.4.5/单向多对多

{% note info %}
一个A对象属于多个B对象,一个B对象也属于多个A对象
{% endnote %}

public class Student{
    private List<Teacher> teachers = new List<Teacher>();
}

public class Teacher{
    private List<Student> students = new List<Student>();
}

单向多对多

2.5/聚合关系

聚合关系是关联关系的一种特例,他体现的是整体与部分,是一种“弱拥有”的关系,即has-a的关系。聚合是整体个体之间的关系

关联关系所设计的两个类是要处在同一个层次上的,而在聚合关系中,两个类是处在不平等的层次上的,一个代表整体,一个代表部分。

聚合通常使用空心菱形+实心箭头表示

public class Phone{
    private class Card;
}

public class Card{

}

聚合关系

2.6/组合关系

组合关系也是关联关系的一种特例,体现的是一种contains-a(包含)关系,比聚合更强,所以也是强聚合

整体和个体不能独立存在,一定是在一个模块中同时管理整体和个体,生命周期必须相同(级联)。

{% note info %}
按照我的理解就是字面意思,出现一定是"组合"起来出现,不会两个人单独出现
{% endnote %}

组合通常使用实心菱形+实线箭头表示

public class OrderBill{
    private List<OrderBillItem> items = new List<OrderBillItem>();
}

public class OrderBillItem{
    private OrderBill bill;
}

组合关系

一个还在寻找自己的三流开发者