UML类关系图记不住?一篇搞定
前言背景
为什么要看UML,最近小编在准备架构师考试不得不再拾起来回顾看一看这块内容,毕竟谁也不会和考试的重点部分过意不去。之前也接触过这块的内容,总是搞混,关联关系用实线、泛化关系用实现空心箭头 ...... 表示,老记混淆。刚开始怀着只要干不坏,就往死里干心里记忆,结果打脸来的太快,真的太难了。
UML类关系
6 种UML类图常见的关系
- 泛化(Generalization)
- 实现(Realization)
- 聚合(Aggregation)
- 组合(Composition)
- 关联(Association)
- 依赖(Dependency)
类关系定义
1、泛化 (is a)
是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。JAVA代码中,关键字 extends
2、实现
是一种类与接口的关系,表示类是接口所有特征和行为的实现。JAVA代码中,关键字 implements
3、聚合(has a)
整体与部分的拥有关系,且部分可以离开整体而单独存在, 它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享,所以聚合关系也常称为共享关系。 是关联关系的一种特例,在代码实现上无法进行具体区分,只能考虑具体的业务与逻辑关系。 【代码体现】 成员变量 ,即作为类的属性
4、组合 (contains a)
整体与部分的关系,但部分不可以离开整体而单独存在,部分不能给其他整体共享,作为整体的对象负责部分的对象的生命周期。这种关系比聚合更强,也叫强聚合。 也是关联关系的一种特例 【代码体现】 成员变量 ,即作为类的属性
5、关联
是一种拥有关系,它是类知道另一个类的属性和方法; 在Java中,关联关系的代码表现形式为一个对象含有另一个对象的引用。 也就是说,如果一个对象的类代码中,包含有另一个对象的引用,那么这两个对象之间就是关联关系。 关联关系有单向关联和双向关联,大多数关联都是单向关联,单向关联关系更容易建立和维护。 【代码体现】 成员变量 ,即作为类的属性
6、依赖 (use a)
是一种使用关系,一种若对关联关系,即一个类的实现需要另一个类的协助,所以尽量不要双向依赖。如驾驶员和汽车关系,驾驶员使用汽车 【代码体现】方法或构造器的的参数、方法的返回值,局部变量或者对静态方法的调用
类关系的图像
1、记忆类关系的顺序
在评价软件架构的优劣时,使用的重要标准是高内聚,低耦合
按照耦合程度的高到低依次为 泛化=实现>组合>聚合>关联>依赖
泛化 和 实现 都是强耦合,组合、聚合都属于特殊的关联关系,整体与部分的关系。组合 生命周期一致要求更高,其次是 聚合,然后是 关联 关系,最后是 依赖 (作为 类方法的参数和局部变量出现)。
2. 记住类关系的图案
类关系图总结 TIps :6-24-222 6个关系 2条虚线,4条实线 2个箭头,2个三角形、2个菱形(一个实心一个空心)
组合、聚合 都是带菱形的实线。
- 组合 耦合度更高(要求生命周期一致)带实心菱形的实线。
- 聚合 带 空心菱形的实线。
- 关联 带 箭头的实线。
- 依赖 带 带箭头的虚线。
剩下的就是带三角的线了
- 泛化 继承父与子的关系 带三角的实线。
- 实现 带三角的虚线。
具体例子
示例一:
示例二:
箭头指向
菱形代表整体,其他总是指向非当前类
聚合 棱形 指向(代表)整体
组合 棱形 指向(代表)整体
关联 指向被关联类
依赖 指向被依赖类
泛化 继承 指向父类
实现 接口 指向接口
到此为止认真看的话,应该差不多能记住了,后面就是有机会多练习了。下图来源《大话设计模式》