UML 基本介绍
- UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果
- UML本身是一套符号的规定, 就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如
- 类
- 接口
- 实现
- 泛化(继承)
- 依赖
- 组合
- 聚合
- 等
- 使用UML来建模,常用的工具有Rational Rose, 也可以用一些插件来建模
UML建模插件(Eclipse版)
自行参考老师的建模工具UML建模插件(IDEA版)
因为现在开发中大多数都是使用的IDEA,虽然视频中使用的是Eclipse, 但是我还是使用IDEA来写
在这个给大家推荐一个很好用的UML插件安装PlantUML
安装直接参考链接安装就可以,我单独写了一篇,就不在这里再写了
这个插件功能非常强大,不止可以用来画类图和根据类直接解析成图还可以画
我们这里只说Class 类图
符号,关系
参考官网 类图符号
我这里只写一下关系符号
语法 | 描述 | 样式 |
---|---|---|
(—)代表直线(..)代表虚线 | 关系描述 | 图样式 |
A —|> B | 继承 | ![]() |
A ..|> B | 实现 | ![]() |
A ..> B | 依赖 | ![]() |
A —> B | 关联 | ![]() |
A —o B | 聚合 | ![]() |
A —* B | 组合 | ![]() |
UML 图
画图其实和写文章差不多,都是把自己的思想描述表达出来,关键是在于思路和条理
分类
用例图 | use case |
---|---|
静态结构图 | 类图, 对象图, 包图, 组件图, 部署图 |
动态行为图 | 交互图(时序图与协作图), 状态图, 活动图 |
说明:
- 类图是描述类与类之间的关系, 是UML 图中最核心的, 同样也是设计模式中的核心
UML 类图
基本介绍
- 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系
- 类之间的关系: 依赖, 继承, 实现, 关联, 聚合 和 组合
示例
代码形式
package com.dance.design.uml.demo;
public class Person {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在这里教一个小技巧, 我们写完代码后不需要手动去画类图,可以直接使用PlantUML Parser解析出来
在类上点击
起一个名字点击生成,就可以得到类图了
是不是非常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{}
类图
这个生成出来只有类图,没有依赖关系, 自己去写关系,通过上面说的符号,关系
我这里写一遍后面就直接贴图了
@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
小结
- 类中用到了对方
- 如果是类的成员属性
- 如果是方法的返回类型
- 如果是方法接收的参数类型
- 方法中有使用到
泛化(继承)关系
泛化其实就是继承, 是依赖关系的一种特殊情况代码
``` 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
}
当然开发中不会这么写,一般都会用中间表,这里只是写样例
<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{} ```
类图
组合采用实线-实心菱形表示