https://blog.csdn.net/u012349616/article/details/52564613
UML Class Relationships
由于最近看一些java书涉及到了uml类图,因此查阅资料,思考后整理总结写成如下文章
注重于理解,没有如何实现(画图)的部分
Generalization/specialization
一般而言是指继承
Realization
表示一些已定义但是没有任何实现细节的类,所以很多情况是指接口和抽象类
Dependency
dependency exists between two elements if changes to the definition of one element (the supplier) may cause changes to the other (the client)
- 1
- 2
依赖其实定义非常模糊,所以使用依赖只应该是在其他关系无法表示的时候:
- 依赖通常体现为调用一个其他所依赖类的方法
- 在代码中往往体现为依赖类作为函数参数或者局部临时变量
- 举例:人依赖车
Association
- 关联暗示了依赖,与依赖的最大区别在于:关联类通常作为一个类成员变量存在
- 与依赖相似,关联用来表示无法用聚合和组合表示的关系
- 举例:学生与老师的关系
- 依赖与关联更详细的区别介绍
Aggregation
聚合和组合是两种部分整体的关联关系
- 我认为最重要的特点是成员可独立
- 举例:班级与学生
Composition
- 我认为最重要的特点是成员不可独立
- 成员必须依赖于整体才有意义
- 举例:汽车和引擎
关联,聚合,组合的区别
从例子来说
- 老师不能说包含学生,但老师带很多学生;学生同样不包含老师,但一个学生可以有很多老师
- 班级包含很多学生,但学生自己可以独立存在,所以并不是在班级中创建的学生,而是班级中有学生的reference
- 汽车包含引擎,引擎脱离汽车之后毫无意义,所以引擎必须依赖于汽车,不可独立存在
再说聚合和组合
- 很多文章都会说组合意味着拥有共同的lifetime,这点我不完全同意,因为以汽车和引擎为例,即使某一汽车坏了,引擎也可以搬移到其他的汽车上使用,所以生命周期的说法在我看来不完全对,所以我也并没有说在汽车里创建引擎
- 另一种说法是聚合的对象是可分享(share)的,而组合不是,这种说法我觉得比较靠谱,所以最后总结一下:
- 聚合与组合区别可以考虑是否可独立和是否可分享
- 更详细的讨论
再说关联
- 可以认为除了聚合和组合之外的类成员关系均认为是关联
最后,我想补充一下
- 以上对于不同关系的定义是尽量关系正交,尽可能不存在重叠
- 这几种关系是语义上的区别,关系之间可以相互转化,所以一定要具体情况具体分析