UML 基本介绍

  1. UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果
  2. UML本身是一套符号的规定, 就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如
    1. 接口
    2. 实现
    3. 泛化(继承)
    4. 依赖
    5. 组合
    6. 聚合

image.png

  1. 使用UML来建模,常用的工具有Rational Rose, 也可以用一些插件来建模

    UML建模插件(Eclipse版)

    自行参考老师的建模工具
    image.png
    image.png

    UML建模插件(IDEA版)

    因为现在开发中大多数都是使用的IDEA,虽然视频中使用的是Eclipse, 但是我还是使用IDEA来写
    在这个给大家推荐一个很好用的UML插件

    安装PlantUML

    https://www.yuque.com/jieshou-r0wj4/gtydap/me3gmz

安装直接参考链接安装就可以,我单独写了一篇,就不在这里再写了
这个插件功能非常强大,不止可以用来画类图和根据类直接解析成图还可以画
image.png
我们这里只说Class 类图

符号,关系

参考官网 类图符号

https://plantuml.com/zh/class-diagram

我这里只写一下关系符号

语法 描述 样式
(—)代表直线(..)代表虚线 关系描述 图样式
A —|> B 继承 image.png
A ..|> B 实现 image.png
A ..> B 依赖 image.png
A —> B 关联 image.png
A —o B 聚合 image.png
A —* B 组合 image.png

其他语法直接看上面的链接, 里面有详细写 语法

UML 图

画图其实和写文章差不多,都是把自己的思想描述表达出来,关键是在于思路和条理

分类

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

说明:

  1. 类图是描述类与类之间的关系, 是UML 图中最核心的, 同样也是设计模式中的核心

UML 类图

基本介绍

  1. 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系
  2. 类之间的关系: 依赖, 继承, 实现, 关联, 聚合 和 组合

    示例

代码形式

  1. package com.dance.design.uml.demo;
  2. public class Person {
  3. private Integer id;
  4. private String name;
  5. public Integer getId() {
  6. return id;
  7. }
  8. public void setId(Integer id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. }

在这里教一个小技巧, 我们写完代码后不需要手动去画类图,可以直接使用PlantUML Parser解析出来
在类上点击
image.png
image.png
起一个名字点击生成,就可以得到类图了
image.png
是不是非常Nice

依赖关系

只要是在类中用到了对方, 那么他们之间就存在依赖关系,如果没有对方,编译都通不过

代码

package com.dance.design.uml.dep;

public class PersonServiceBean {
    private PersonDao personDao;

    public void savePerson(Person person){}

    public IDCard getIDCard(Integer personId){ return new IDCard(); }

    public void modify(){
        Department department = new Department();
    }
}
class PersonDao{}
class IDCard{}
class Person{}
class Department{}

类图

image.png
这个生成出来只有类图,没有依赖关系, 自己去写关系,通过上面说的符号,关系
我这里写一遍后面就直接贴图了

@startuml
class com.dance.design.uml.dep.PersonServiceBean {
- PersonDao personDao
+ void savePerson(Person)
+ IDCard getIDCard(Integer)
+ void modify()
}
class com.dance.design.uml.dep.PersonDao {
}
class com.dance.design.uml.dep.IDCard {
}
class com.dance.design.uml.dep.Person {
}
class com.dance.design.uml.dep.Department {
}
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.PersonDao
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.IDCard
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.Person
com.dance.design.uml.dep.PersonServiceBean ..> com.dance.design.uml.dep.Department
@enduml

image.png
OK了

小结

  1. 类中用到了对方
  2. 如果是类的成员属性
  3. 如果是方法的返回类型
  4. 如果是方法接收的参数类型
  5. 方法中有使用到

    泛化(继承)关系

    泛化其实就是继承, 是依赖关系的一种特殊情况

    代码

    ``` package com.dance.design.uml.ext;

public abstract class AbstractPerson { public void save(){}

public void delete(){}

} class Person extends AbstractPerson{

}

<a name="RL14m"></a>
### 类图
刚才在点击IDEA的时候发现IDEA其实默认是带了Diagrams这个类图插件的,这个也挺好用的直接就能显示,但是好像不能修改,但是可以控制方法,构造,接口这些是不是展示,感觉也挺好的, 有喜欢的可以去试试, 这里我们还是用PlantUML吧<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649834111948-25fdfa2b-dcba-4f04-bc12-41214f5a79d2.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=738&id=ucad45ecc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=922&originWidth=1268&originalType=binary&ratio=1&rotation=0&showTitle=false&size=122268&status=done&style=none&taskId=uc1cdd816-3393-4350-82d8-67b04d84c4f&title=&width=1014.4)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649834240320-5694f435-8a11-46ff-91ae-7490b71ccb91.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=306&id=u55e2c6b2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=382&originWidth=336&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24476&status=done&style=none&taskId=u44eda2b1-4ca9-4071-a43b-126544c1d85&title=&width=268.8)<br />哦~原来继承关系是可以自动解析出来的, 但是依赖就不行了<br />然后又回去看了看 Diagrams 发现居然可以展示依赖关系,上面有个小按钮, 还有组合关系居然也显示出来了, 而且也能编辑修改,突然感觉PlantUML不香了<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649834427329-7f031bc9-fff7-4eac-a876-24f1fe15db3c.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=511&id=u1e771513&margin=%5Bobject%20Object%5D&name=image.png&originHeight=639&originWidth=1333&originalType=binary&ratio=1&rotation=0&showTitle=false&size=67600&status=done&style=none&taskId=u9109ad32-1a48-4c3c-93c2-27f98e1df90&title=&width=1066.4)<br />而且还可以控制是否展示方法,啥的<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649834633108-a4c25f78-5361-4796-a1bf-fb51a22c1b6a.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=278&id=u1ba5fe21&margin=%5Bobject%20Object%5D&name=image.png&originHeight=347&originWidth=779&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35638&status=done&style=none&taskId=ue1d09789-37a2-457d-a5e6-c609176c7d1&title=&width=623.2)<br />emm, 我们还是以PlantUML来写吧, 工作中自然是哪个好用 用哪个(然后我在后面其实都贴了Diagrams的图)
<a name="qirQs"></a>
### 小结

1. 泛化就是继承
1. 我感觉这个名词绝对是个坑, 继承就继承白, 还泛化, 面试的时候肯定会有点蒙
<a name="CQfNg"></a>
## 实现关系
就是A类实现了B接口, 其实也是依赖的一种特殊情况
<a name="Kpt3R"></a>
### 代码

package com.dance.design.uml.impl;

public interface PersonService { void save(); } class PersonServiceImpl implements PersonService{ @Override public void save() { System.out.println(“实现”); } }

<a name="KT1mY"></a>
### 类图
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649835136533-62d3ddda-b878-48e5-8f78-6a154d70fb0d.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=226&id=u707ec0a2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=283&originWidth=406&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14127&status=done&style=none&taskId=u129be1b5-938c-4e7b-9dcb-2af66a88355&title=&width=324.8)<br />没错, 我粘贴了Diagrams的图<br />但是突然发现两个一起使用会更好,如果是单个类文件的话,Diagrams会更好, 但是如果是包的话PlantUML会更好<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649835349138-3de2986f-c84a-425f-ba01-4e00ea1385f3.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=195&id=u36fb36ac&margin=%5Bobject%20Object%5D&name=image.png&originHeight=391&originWidth=325&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13419&status=done&style=none&taskId=ubac30c6b-698a-41bc-a823-75a333d9096&title=&width=162)![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649835370145-71cd6fbc-5960-43bf-834d-4aaf82b1588f.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=153&id=u19689d13&margin=%5Bobject%20Object%5D&name=image.png&originHeight=357&originWidth=1182&originalType=binary&ratio=1&rotation=0&showTitle=false&size=78200&status=done&style=none&taskId=u8d4975e2-882b-414d-85cd-dcbff4c76fb&title=&width=507)<br />有对比才有伤害<br />感觉PlantUML有点不好,就是在解析的时候不解析依赖关系, 其他的都很好,哎后面还是用PlantUML吧(渣男本难)
<a name="pMcBJ"></a>
### 小结
实现关系其实 没什么好说的,这个是在开发中最常用的 接口+impl
<a name="U5IVj"></a>
## 关联关系
关联关系其实就是类与类之间的关联<br />常见的关联关系其实就是表设计时候的关系

| 关系 | 描述 |
| --- | --- |
| 1 对 1 | 一个人 一张身份证 |
| 1 对 多 | 一个公司下好多部门 |
| 多 对 多 | 一个部门下好多人, 一个人又存在于多个部门 |

关联具有导航性, 就是方向 1 -> 1 是单向的 如果是 1 <-> 1就是双向的<br />关系具有多重性 

- 1 表示有且仅有1个
- 0... 表示0个或多个
- 0,1 表示0个或者1个
- n...m 表示n个到m个都可以
- m...* 表示至少m个
<a name="Cp8W2"></a>
### 一对一
<a name="Wvn2n"></a>
#### 代码

package com.dance.design.uml.gl.onevone;

public class Person { /**

 * 身份证
 */
private IDCard idCard;

} class IDCard{}

<a name="B5O3D"></a>
#### 类图
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649837709550-aeb11475-e986-4009-8256-d0dd1f4f4cd4.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=146&id=u7063f324&margin=%5Bobject%20Object%5D&name=image.png&originHeight=182&originWidth=219&originalType=binary&ratio=1&rotation=0&showTitle=false&size=5657&status=done&style=none&taskId=ue167fe8c-f9f2-4499-9f94-d32e69f60c9&title=&width=175.2)
<a name="JauWp"></a>
### 一对多
<a name="ZQAo1"></a>
#### 代码

package com.dance.design.uml.gl.onevduo;

import java.util.List;

public class Gx { /**

 * 多部门
 */
private List<Department> departments;

} class Department{}

<a name="eKv21"></a>
#### 类图
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649838323158-c4748490-4380-4ead-b1cf-bfa2c0b5dbde.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=228&id=u7ae93f3b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=285&originWidth=483&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14104&status=done&style=none&taskId=u2db6dcdf-080f-4aef-95ca-67de010637a&title=&width=386.4)
<a name="tFObY"></a>
### 多对多
<a name="Uos9K"></a>
#### 代码

package com.dance.design.uml.gl.duovduo;

import java.util.List;

public class Person { private List departments; } class Department{ private List personList;
}

当然开发中不会这么写,一般都会用中间表,这里只是写样例
<a name="frS6L"></a>
#### 类图
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649838514404-2b6671d9-edfc-47a3-bd54-fb96a6774062.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=214&id=ud976993f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=267&originWidth=404&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15517&status=done&style=none&taskId=u84225c9f-0bfd-4c02-acd2-722791f4c96&title=&width=323.2)
<a name="J7ZBN"></a>
## 聚合关系
<a name="kh2sN"></a>
### 基本介绍
聚合关系表示的是**整体和部分的关系, 整体和部分可以分开**, 聚合关系是**关联关系的特例, **所以他具有关联的**导航性和多重性**
> 一台电脑由键盘, 显示器, 鼠标等部件组成; 组成电脑的各个配件是可以从电脑上分离出来的, 使用实线-空心菱形表示

<a name="FRIGZ"></a>
### 代码

package com.dance.design.uml.gl.jh;

public class Computer { public Mouse mouse; public Keyword keyword; public View view; } class Mouse{} class Keyword{} class View{}

<a name="GHl8d"></a>
### 类图
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1603133/1649840765070-1dc0fb8c-6edb-4558-b5c0-94c2babd372c.png#clientId=u4f580d48-15d1-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=297&id=ufc9fa1e6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=371&originWidth=500&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35826&status=done&style=none&taskId=u2025f7f4-800e-43b7-94c4-c15c92927bc&title=&width=400)
<a name="f2AqU"></a>
## 组合关系
<a name="ML3Vb"></a>
### 基本介绍
组合关系: 也是整体与部分的关系, 但是整体和部分不可以分开
> 在我们看来, 台式机, 鼠标和键盘和显示器, 都是可以从主机上分离的, 所以他们是聚合关系, 但是如果是笔记本的话,显然自带键盘, 显示器都是不可分离的, 只有鼠标可以分离(触控板不可以), 这时显示器和电脑是组合关系,键盘和电脑是组合关系, 鼠标和电脑是聚合关系

<a name="uolUR"></a>
### 代码

package com.dance.design.uml.gl.jh;

public class Computer { public Mouse mouse; private Keyword keyword = new Keyword(); private View view = new View(); } class Mouse{} class Keyword{} class View{} ```

类图

image.png
组合采用实线-实心菱形表示