![4651321-739e47663cffe957.png](https://i-blog.csdnimg.cn/blog_migrate/4f3cf412b321605f6627a7f7eca601ef.webp?x-image-process=image/format,png)
阅读原文请访问我的博客 BrightLoong's Blog
UML全称**Unified Modeling Language **又称统一建模语言或标准建模语言。我们再学习各种框架或者设计模式之类的时候经常会看到UML类图,这里将UML类图一些基本点做一个记录。
在文章中所涉及到的UML类图是使用starUML工具创建,使用其他工具创建会有所不同。
总体印象
![4651321-9b9158148c1ba7d6.png](https://i-blog.csdnimg.cn/blog_migrate/7bf9af3fbc5d5b44b5766196a9e0adfe.webp?x-image-process=image/format,png)
上面的UML类图基本展示了UML类图的大部分元素,以及类与类之间的关系,下面将对其一一进行解释。
NOTE
![4651321-0017a9925bd8d774.png](https://i-blog.csdnimg.cn/blog_migrate/a04b40623f6f92b39523584d8b716f45.webp?x-image-process=image/format,png)
UML类图注解的表示方法,如上右半部所示。
类结构表示
![4651321-f5c9b474f9a1d459.png](https://i-blog.csdnimg.cn/blog_migrate/5177092478c7a9be31d734155d01d1bb.webp?x-image-process=image/format,png)
![4651321-28687aed1bcce83b.png](https://i-blog.csdnimg.cn/blog_migrate/a1eb847dc981a91f41a1c4afcfab0a79.webp?x-image-process=image/format,png)
类的表示方法如图,一般分为三层,从上到下依次为类名、属性和方法。接口表示和类的表示类似,只是在上面标明了是interface(这只是表示接口的一种方式,并且不同的工具展现方式可能不同,还有一种棒棒糖的形式,就是一个圆加一条竖线,并不常见,所以也不过多介绍),并且这里我隐藏了属性层。如果是抽象类,在使用starUML工具创建的时候类名会以斜线表示。关于类的表示有以下几点:
- +:public,-:private,#:protected
- 属性冒号后的内容表示属性的类型
- 方法冒号后的内容表示属性的返回值
- 类型说明并不是必须的
类关系表示
实现
![4651321-0927dfda4e9549c3.png](https://i-blog.csdnimg.cn/blog_migrate/f40833985e3b16829c45bed52ed9d98d.webp?x-image-process=image/format,png)
实现(Realization),用一个带空心三角箭头的虚线来表示。用来表示接口和实现类的关系。比如:Plane(飞机)和Car(汽车)都实现了接口IVehicle(交通工具)。
继承
![4651321-ee5b579ee1505d4d.png](https://i-blog.csdnimg.cn/blog_migrate/2d435287d00e7ac4fc7ca60412b00d97.webp?x-image-process=image/format,png)
继承(Generalization,也称为泛化关系),用一个带空心三角箭头的实线来表示。表示父类与子类之间的关系。比如:Trunck(卡车)和Bus(公交车)都继承自父类Car(汽车)。
关联关系
关联(Association),关联关系分为以下几种
- 自关联:用一头带箭头的实线表示,自己指向自己
- 单向关联:用一头带箭头的实线表示,箭头指向被关联类
- 双向关联:用一条实线表示,或者使用双箭头
关联关系表示类与类之间的联系,是同一层次上的关系,它不像依赖关系具有偶然性和临时性。一般情况是关联类引用被关联类作为全局变量。如下Human持有Name。
大多数的关联关系都是单向的。
![4651321-aa317b939bc75baf.png](https://i-blog.csdnimg.cn/blog_migrate/52a10f2a79a731e2c2bab70f260f692b.webp?x-image-process=image/format,png)
![4651321-a3617572b0c4d04c.png](https://i-blog.csdnimg.cn/blog_migrate/f290e1cee129718479ed649922ac0095.webp?x-image-process=image/format,png)
聚合关系
![4651321-3dee50ce11077ac7.png](https://i-blog.csdnimg.cn/blog_migrate/8e086537e890795cfeb56df6a57e1948.webp?x-image-process=image/format,png)
聚合(Aggregation),用一头是空心菱形的直线表示(有些时候是一头为空心菱形,一头为箭头的实线)。聚合也是关联关系的一种,是整体和部分之间的关系,也就是has-a的关系(很多地方has-a,contains-a已经比较混乱,我理解上来看是has-a),整体包含部分,但是部分脱离整体后依然可以单独存在。如上:Car(汽车)包含Engine(引擎),但是Engine脱离了Car依然可以独立存在。
组合关系
![4651321-bd04d78f364335e8.png](https://i-blog.csdnimg.cn/blog_migrate/9ebc972ea6211ef3c2bdca11d936fbf8.webp?x-image-process=image/format,png)
组合(Composition),用一头是实心菱形的直线表示(有些时候是一头为实心菱形,一头为箭头的实线)。组合同样是一种关联关系,也同样是整体和部分之间的关系,我把它理解为contains-a的关系。和聚合的区别在于,部分脱离整体和无法单独存在,整体和部分具有相同的生命周期,整体不存在了,部分也就消失了。如上:Human(人类)包含Head(头)和Body(身体),头和身体并不能单独存在。
依赖关系
![4651321-5d8f2f3164fe23a1.png](https://i-blog.csdnimg.cn/blog_migrate/147e0ba3d62f58189d5fe6777275cf4e.webp?x-image-process=image/format,png)
依赖(Dependency),用一头带箭头的虚线表示。表示类与类之间,一个类依赖于另一个类的定义。被依赖类的变化将会引起依赖类的变化。在java中依赖关系通常体现为,一个类使用另一个类作为局部变量,方法参数或静态方法调用,表示为use-a。如上,Engine的方法startEngine()方法使用Gasoline(汽油)作为参数,可能是调用了Gasoline中的burn()方法。