UML图在日常工作和学习中承担着极为重要的作用,也是后续博客撰写过程中高频出现的一个部分,在入职培训的时候还专门做过一个课题的研究学习。但当时实际使用不多,印象没有非常的深刻。这里有必要每当使用UML的一种类型之前,先把相关的知识点整理一下,方便后续的记忆和使用,也是作为正式博客产出的前置内容。
这里先讨论一下最简的类图。顾名思义类图就是描述类之间关系的结构图,关于定义,内容,使用方法等网上都有足够详尽的文章,这里不再赘述。基于读者都已经熟悉了基本内容且处于刚实际上手的视角,来谈谈对于类图的认知。
网上文章为了便于读者理解,一般是使用各种现实中事物之间的关系来做类比。但不太利于更加快速直观的对应到类中的实际情况。所以还是建议读者在有一定代码阅读量的基础上,直接通过类中各种典型的使用场景作为特征,来区分理解各种类之间的关系。
一. 类之间的关系
类与类之间有若干种关系,如果一上来就混在一起全部学习的话,很容易搞混且不容易记忆。这里采用的是以关联性的强弱为依据,分梯度的方式来认知。
1.1 相对独立关系
1.1.1 继承 (空心三角+实线)
- 这是最直观的一种关系,对应代码中extend(包含了普通继承和抽象继承,至于两者的区别在类的内部体现,类之间无差异,后文会阐述。)
- 对应的专业术语有is-a、泛化等,如果不是专门正式的使用相关内容,简单的了解即可
1.1.2 实现(空心三角+虚线)
- 对应接口与实现类的关系,关键词显然为implements。
以上两种关系十分明显和简单,不过多说明。
1.2 依赖关系(虚线+箭头;使用关系)
依赖是一种相对的弱相关,同样比较直观,易于区分。 简单的理解即为一个类持有另一个类实例的引用。A类的一个方法f1(B b)传参传进来了B类的实例,并且只在局部范围中使用。
1.3 关联关系(组合与聚合;拥有关系)
从这类关系开始不易于区分,需要根据关键特性来加以理解和记忆。 和依赖关系最为显著的区别就是:A类是以成员变量的方式持有B类的实例的。
1.3.1 组合关系(被持有类B箭头 实心菱形◇持有者类A;强生命周期关系;)
典型场景:A类的构造方法里面new了B类的一个实例并赋值给对应成员变量,。即类A主动创建了类B的实例,并且此实例通常情况下仅由本类来使用。
1.3.2 聚合关系(被持有类B箭头 空心菱形◇持有者类A;弱生命周期关系;)
典型场景:A类通过setter方法来给B类的引用赋值,B类对象的创建不是由A类实现的。
1.3.3 普通关联
普通关联又从不同角度把关联关系分成了单向关联、双向关联、自关联三部分,简单了解即可。
1.4 如何区分关联和依赖? && 聚合和依赖?
- 本质上讲关联就是一个类以全局变量的形式持有另一个类的实例,掌握这一点就可以和依赖关系很好的进行区分。
- 依赖和聚合都是将实例通过方法传进来的,但聚合是传进来给成员变量赋值,常见有通过setter的方法;而依赖是普通方法带类的形参,传进实参用作方法内局部变量使用。
1.5 耦合性强弱
模块解耦、防止内存泄漏等是实际项目开发中极为重要的内容,理清各种类关系的耦合强度是必要的。从耦合关系由强到弱来看:(关联)组合>(关联)聚合>依赖。
二. 类的成员和方法的表示
类与类之间的关系可以通过上述几节来加以区分,类内部的成员和方法在uml中如何表示网上也有详尽的讲解,没有什么特别需要强调的内容。 这里提出一个建议:在类内部方法和变量过多的情况下,只选取重要的以及和外部相关类有交互的内容展示即可。
三. 资料
https://blog.csdn.net/jiahao1186/article/details/82634723
https://www.cnblogs.com/wanghuaijun/p/5421419.html
https://www.cnblogs.com/LT0314/p/3756349.html