UML类对象基本关系解析
我们平常要使用UML工具画类之间的关系,因此经常会见到依赖、关联、泛化、继承、实现、聚合、组合等概念,那么他们是怎么样的,区别在哪里呢?我在这里整理一下:
- 依赖
依赖是指类A要完成一定的功能,必须要类B的帮助,例如使用到类B的方法,而类A和类B之间并没有比较亲密的联系,只是要利用B而已,他们之间的关系是偶然的,临时性的,比较脆弱,体现在代码形式上:类B只需作为类A的方法参数,或者类A直接使用类B的静态方法,而类B不会形成类A的属性 。
在UML类图关系表示上:
虚线+箭头指向被依赖方,依赖关系好的实践是单向依赖,坏的实践的相互依赖,,千万不要出现双向依赖。
- 关联
关联是指类A和类B之间存在比较强的关系,与依赖相比,这种关系不是偶然性的,例如人和人的常用住址,就是一种比较强的关系,不是临时的,是长期的,体现在代码层面:类B作为类A的一个属性存在,体现出他们的关系比较紧密。
在UML类图关系上:
实线+箭头指向被关联方,关联关系可以是双向,即A和B相互为对方的一个属性。
至于到底是用依赖还是关联关系,主要是看类之间关系的强弱,这个需要在一定的语境中来确定。
- 泛化(继承)
泛化关系其实就是继承关系,包括接口继承和类继承,这个比较好理解。
在UML关系图上表现:
实线+空心三角箭头指向被继承的基类或接口
- 实现
实现关系也很好理解,类实现了一个接口。
UML关系图如下:
虚线+空心三角箭头指向被实现接口
- 聚合
聚合是关联的一种特例,语义上表示整体和个体 概念,表示has-a关系,整体和个体是可以分离的,整体和个体生命周期是独立的,例如,公司和员工,社团和成员,成员可以属于多个不同的整体,在代码层面上,聚合与关联是一样的,因此只能从语义上来区分。
在UML类图关系如下:
- 组合
组合也是关联的一种特例,语义上表示主体和部分 概念,表示contains-a关系,整体和部分是不可以分离的,他们的生命周期是关联在一起的,主体灭亡,部分也随着灭亡,代码层面上,组合关系与聚合和关联都是一样的,因此也只能从语义上进行区分。
可见,其实这几个区别还是比较明显的,他们之间的关系基本都体现在语义关系上,代码上的实现可能基本类似,不过有一点,有了语义上的区分,那么在代码层面上尽量体现出语义来,也是一个比较好的做法,例如,代码中最好不要带着hand对象单独到处跑,应该跟着person才是最好的选择。