# UML图

## 1. 什么是UML图

UML（Unified Modeling Language）统一建模语言，是一种开放的方法，用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。

## 2. UML类图的组成

UML类图由三部分组成：类名、属性和方法。

eg：

```java
class Person {

    private String name = "personName";
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}
```

![](https://3037548586-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnpynfpU0w3FBTJVlOK%2Fsync%2F5fd6a48db7866ea5b4280fcf06784a9a9d05e6b1.png?generation=1603853419713902\&alt=media)

**类名：**&#x7C7B;名就是类的名称，如果是抽象类的话就在右下角加一个（Abstract）标识。

**属性：**&#x5C31;是类的成员变量，可见性表示为public（+）、protected（#）、private（-）。在UML类图中可以表示属性的可见性、名称、类型和默认值，格式如下（\[] 里面的表示可选，可以有可以没有）：

```
可见性  名称:类型 = 默认值
```

**方法：**&#x53EF;见性同属性，格式如下：

```
可见性  名称(参数列表) : 返回类型
```

## 3. UML类图关系

UML类图之间的主要关系有6种：继承关系，实现关系，依赖关系，关联关系，聚合关系，组合关系。

### 3.1 继承关系

子类和父类之间的关系，可以用带空心三角形的实线表示。

如果一个Teacher类继承上面的Person类：

```java
class Teacher extends Person {

    private int teacherNum;

    public String teach() {

        return "teaching";

    }
}
```

UML图可以表示为：

![](https://3037548586-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnpynfpU0w3FBTJVlOK%2Fsync%2Fba9812d65c2df80d799a3d01b6fe24936eee7494.png?generation=1603853420728511\&alt=media)

### 3.2 实现关系

类和接口之间的关系，可以用带空心三角形的虚线表示。

如下一个Dog类和一个Cat类实现了Animal接口：

```java
public interface Animal {
    public void eat();
}
```

```java
public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("狗狗吃狗粮");
    }
}
```

```java
public class Cat implements Animal {
    @Override
    public void eat() {
        System.out.println("咪咪吃猫粮");
    }
}
```

UML可以表示为：

![](https://3037548586-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnpynfpU0w3FBTJVlOK%2Fsync%2F2831fc10a8ecced4afb1f34abae7c7109a7c4017.png?generation=1603853422744178\&alt=media)

### 3.3 依赖关系

### 3.4 关联关系

### 3.5 聚合关系

聚合关系使用空心菱形表示。

聚合是一种特殊的关联(Association)形式，表示两个对象之间的所属(has-a)关系。所有者对象称为聚合对象，它的类称为聚合类；从属对象称为被聚合对象，它的类称为被聚合类。例如，一个公司有很多员工就是公司类Company和员工类Employee之间的一种聚合关系。被聚合对象和聚合对象有着各自的生命周期，即如果公司倒闭并不影响员工的存在。

比如：

```java
public class Company {
    private List<Employee> employees;
}

public class Employee {
    private String name;   
}
```

UML可以表示为：

![](https://3037548586-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnpynfpU0w3FBTJVlOK%2Fsync%2Fa92cffa7c515bb5b0bad23442743a57d1cd359f5.png?generation=1603853422616312\&alt=media)

### 3.6 组合关系

组合关系使用实心菱形表示。

聚合是一种较弱形式的对象包含(一个对象包含另一个对象)关系。较强形式是组合(Composition). 在组合关系中包含对象负责被包含对象的创建以及生命周期，即当包含对象被销毁时被包含对象也会不复存在。例如一辆汽车拥有一个引擎是汽车类Car与引擎类Engine的组合关系。

比如：

```java
public class Car {
    private final Engine engine = new Engine();       
}

class Engine {
    private String type;
}
```

UML可以表示为：

![](https://3037548586-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnpynfpU0w3FBTJVlOK%2Fsync%2F44455104c3e141684d7675acb3e61757788e1750.png?generation=1603853423667854\&alt=media)

<https://blog.csdn.net/garfielder007/article/details/54427742>
