UML 肯定有人不熟悉,很多人知道但是不会看、会看不会写、会写写不熟练。这里我很肯定的告诉大家,UML 你用不好,用不熟练,那你就属于:不入流
的那层次。不管你是拿来装逼也好,还是真的设计复杂的功能、业务框架也好,UML 都是飞涨重要、起决定性的制约因素
我直说一点,你在公司里分享自己的功能、业务框架时,没有没 UML 那完全是2个概念,有的话既能装逼得满分,还能让技术大神认同你,上到领导,下到同事都认同你。效果就是这么明显,所以大家 UML 走起吧
去年我专门写过 UML 类图的文章,但是时间久远都忘的差不多了,当时纯自己查资料学习的,看的囫囵吐枣,其中关系不是非常清楚。这几天在B站上看到了:
尚硅谷 韩顺平 图解Java设计模式
这个视频教程,老师讲的非常到位,以下就把 UML 类图其中的6大关系讲的非常清楚、透彻,很赞。其实吧完全不会的内容,要是能找到大机构或是N人的视频讲解,真的比纯自学强太多了,自学很多时候很多认识都是模糊。或是错误的。过写年再回头看,真想抽自己嘴巴,写的都是什么玩意儿...设计模式视频链接:尚硅谷 韩顺平 图解Java设计模式
古人云:B站是个学习网站,真是诚不欺我呀!一入B站深似海,从此游戏是路人...
UML 图分类
UML 图按照功能可以这么分:
用例图 use case
-
静态结构图:
类图、对象图、包图、组件图、部署图 -
动态行为图:
交互图(时序图于协作图)、状态图、活动图
UML 所有的图如下:
-
类图(Class Diagram):
描述系统所包含的类、类内部结构及类之间的关系。 -
对象图(Object Diagram):
是类图的一个具体实例。 -
组件图(Compoment Diagram):
描述代码部件的物理结构以及各部件之间的依赖关系。 -
部署图(Deployment Diagram):
定义系统中软、硬件的物理体系结构。 -
用例图(Usecase Diagram):
从用户的角度出发描述系统的功能、需求,展示系统外部的各类角色与系统内部的* 各种用例之间的关系。 -
时序图(Sequence Diagram):
表示对象之间动态合作的关系。 -
协作图(Collaboration Diagram):
描述对象之间的协作关系。 -
状态图(Statechart Diagram):
描述一类对象的所有可能的状态及事件发生时状态的转移条件。 -
活动图(Activity Diagram):
描述系统中各种活动的执行顺序。
类图是 UML 中最核心的图
UML 类图中类的6种关系
-
依赖
、泛化(继承)
、实现
、关联
、聚合
、组合
看着很多啊,但是就起根本,只有3种关系:
类和属性、参数之间的相互依赖
类的继承
接口的实现
其他的关系大家可以这样理解:
-
关联
是更复杂、更详细表达的特殊依赖
-
聚合
是使用 set 方式传递数据的特殊关联
-
组合
是使用 new 方式产生数据的特殊关联
ok,UML 中大家费解的类关系其实就是这么回事
泛化关系
泛化关系
就是 继承关系
,这点就不用说了
UML 图标:
实线+空箭头
实现关系
实现关系
不用说了,就是实现接口
UML 图标:
虚线+空箭头
依赖关系
定义:
如果类中用到了对方,那么他们之间就存在依赖关系
举例 1:
A 中有个成员变量 B,那么就可以说 A 依赖了 B
举例 2:
Person 类依赖了 IDCard
class Person {
IDCard _idCard;
}
class IDCard {
String info;
}
UML 图标:
虚线+短箭头
特殊说明:
- 并不是只有成员变量才可以成为依赖,不管你在哪里用到的这个对象,都可以称为
依赖
,包括以下情境,只要满足下面的使用情境,就可以称为:依赖
类中用到了对方
类的成员属性
方法的返回类型
方法的参数类型
方法中使用到
- 因为
关联
是依赖
的更详细说明,关联
是专门描述成员属性的关系,所以依赖中所有涉及成员属性的地方更适合使用:关联、聚合、组合
。因为大家看 UML 时看到依赖
,那么肯定就可以排除成员属性的情况,一般多是方法使用到对方
关联关系
定义:
类于类之间的练习,是依赖关系的特列
特性:
关联关系是更具体的依赖关系,关联关系只描述:成员变量
,也就是类和其成员属性之间的关系,可以是:单向一对一
、双向一对一
。所以关联关系的核心是:导航性
,通过关联关系我们只看 UML 就可以精确的了解类之间是怎么组织的了
UML 图标:
-
单向:
实线+短箭头
-
双向:
实线+没有箭头
举例 1:
单向一对一
class Person {
IDCard _idCard;
}
class IDCard {
String info;
}
举例 2:
多向一对一
class Person {
IDCard _idCard;
}
class IDCard {
Person _person;
String info;
}
聚合关系
定义:
整体和部分之间的关系
特性:
同样只描述成员属性、并且整体和部分是可以分开的,通常表现为那些通过 set 方法传递数值的成员变量,需要注意的是聚合关系是关联关系的特例
UML 图标:
-
单向:
实线+空菱形
举例:
电脑和鼠标、显示器就是典型的聚合关系,鼠标和键盘都是热插拔的,没有鼠标键盘不影响开机,电脑一样可以跑起来
class Computer {
Keyborad _keyborad;
Monitor _monitor;
set keyborad(Keyborad value) {
_keyborad = value;
}
set monitor(Monitor value) {
_monitor = value;
}
}
class Keyborad {}
class Monitor {}
组合关系
定义:
同样也是整体和部分之间的关系
特性:
同样只描述成员属性、整体和部分是不可以分开的,通常表现为那些通过 new 创建出来的成员变量,需要注意的是组合关系也是关联关系的特例。当然组合还表现为整体若是销毁了,组件也同样必须销毁
UML 图标:
-
单向:
实线+实心菱形
举例:
电脑和机箱,机箱是电脑的核心所在,没有机箱就没有电脑一说,机箱是电脑永远不可或缺的部分,这就是典型的组合关系,
class Computer {
Keyborad _keyborad;
Monitor _monitor;
Chassis _chassis = Chassis();
set keyborad(Keyborad value) {
_keyborad = value;
}
set monitor(Monitor value) {
_monitor = value;
}
}
class Keyborad {}
class Monitor {}
class Chassis {}
总结
虽然所有的类于属性自之间的关系都可以用依赖表示,但是对于成员变量来说,我们更倾向于使用关联、聚合、组合,剩下的可以用到依赖的时候就是方法传参,返回值的情况居多了,所以大家注意
实线比虚线更能表示类之间的紧密关系
- 继承用的实线,接口实线用的虚线,继承的关系可比接口关系近多了。依赖是虚线,关联是实现,自然描述作为成员属性的关联自然比只剩下方法可以参数返回值可以描述的依赖要和类的关系更加紧密了实心表示不可分割,空心表示可以分离
- 这点从聚合和组合就能看出来,除了组合之外,谁用实心的了