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)
依赖其实定义非常模糊,所以使用依赖只应该是在其他关系无法表示的时候:
- 依赖通常体现为调用一个其他所依赖类的方法
- 在代码中往往体现为依赖类作为函数参数或者局部临时变量
- 举例:人依赖车
Association

- 关联暗示了依赖,与依赖的最大区别在于:关联类通常作为一个类成员变量存在
- 与依赖相似,关联用来表示无法用聚合和组合表示的关系
- 举例:学生与老师的关系
- 依赖与关联更详细的区别介绍
Aggregation

聚合和组合是两种部分整体的关联关系
- 我认为最重要的特点是成员可独立
- 举例:班级与学生
Composition

- 我认为最重要的特点是成员不可独立
- 成员必须依赖于整体才有意义
- 举例:汽车和引擎
关联,聚合,组合的区别
从例子来说
- 老师不能说包含学生,但老师带很多学生;学生同样不包含老师,但一个学生可以有很多老师
- 班级包含很多学生,但学生自己可以独立存在,所以并不是在班级中创建的学生,而是班级中有学生的reference
- 汽车包含引擎,引擎脱离汽车之后毫无意义,所以引擎必须依赖于汽车,不可独立存在
再说聚合和组合
- 很多文章都会说组合意味着拥有共同的lifetime,这点我不完全同意,因为以汽车和引擎为例,即使某一汽车坏了,引擎也可以搬移到其他的汽车上使用,所以生命周期的说法在我看来不完全对,所以我也并没有说在汽车里创建引擎
- 另一种说法是聚合的对象是可分享(share)的,而组合不是,这种说法我觉得比较靠谱,所以最后总结一下:
- 聚合与组合区别可以考虑是否可独立和是否可分享
- 更详细的讨论
再说关联
- 可以认为除了聚合和组合之外的类成员关系均认为是关联
最后,我想补充一下
- 以上对于不同关系的定义是尽量关系正交,尽可能不存在重叠
- 这几种关系是语义上的区别,关系之间可以相互转化,所以一定要具体情况具体分析
注:文中图片据来自与Understanding UML Class Relationships,此文章写的很好
本文介绍了UML类关系中的重要概念,包括继承、实现、依赖、关联、聚合和组合。依赖通常是短暂的调用关系,关联通过类成员变量体现,聚合强调成员可独立,而组合则表示成员不可独立。文章强调理解这些关系的语义区别,并指出它们在实际应用中的转化可能性。
1万+

被折叠的 条评论
为什么被折叠?



