UML类关系(依赖,关联,聚合,组合的区别)

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类关系(依赖,关联,聚合,组合的区别))