Dependency, Association, Aggregation & Composition

uml

UML

最初学习 UML 是五、六年前,没记错的话应该是大三,这门功课结束以后,也就是在毕业设计时涉及到了其中的知识,毕业以后很长的时间里,一直没有在工作场合中加以应用。刀子不用了就会生锈,知识不用了就会遗忘,最近再设计某一应用的 Class Diagram 时,发现已经分不清类图中的几个关系的区别了。

Class Diagram 体现 Class 之间的关系,最为常见的,也是最简单的两种关系分别是 Generalization 和 Realization,余下的还有四种,分别是:Dependency, Association, Aggregation, Composition。这里我之所以坚持使用英语名称,不是我显摆英语好(其实很差劲),是因为我无法理解组合(Composition)和聚合(Aggregation)的差异,毕竟 UML 三友的母语是英语,这些术语也是经过深思熟虑的,译成中文以后,理解起来会有偏差。

上面提到 Generalization 和 Realization 是最常见和最简单的,这是因为很容易从代码上加以体现,如果使用 Java 编程语言,那么二者分别对应 extends 和 implements,余下的四种关系中 Dependency 是比较容易识别:

They (Dependency Relationships) are not implemented with member variables at all. Rather they might be implemented as member function arguments.

— Robert C. Martin, UML Tutorial: Part 1 — Class Diagrams

实际上,看到上面的表述时,很快就明白了 Dependency,但是我又陷入另一个疑问:如此一来,岂不是要由实现代码的细节来反推关系了吗?本该由设计来推动实现,而现在这个过程弄反了。先有鸡?先有蛋?

UML Class Diagrams Example

UML Class Diagrams Example

暂且搁置上面的问题,继续看 Association, Aggregation, Composition,单纯从理论上看,这三种关系的区别还算清晰,但是到目前为止,我还无法将它们从实现代码上把它们区分开来。

Aggregation denotes whole/part relationships whereas associations do not. However, there is not likely to be much difference in the way that the two relationships are implemented. That is, it would be very difficult to look at the code and determine whether a particular relationship ought to be aggregation or association.

— Robert C. Martin, UML Tutorial: Part 1 — Class Diagrams

从理论上讲,Aggregation 和 Association 的区别在于前者强调的是整体和部分的关系,但这在代码上是很难区分的。Composition 和 Aggregation 的区别在于前者强调 lifetime,用一句谚语说:皮之不存,毛将焉附?

2 Comments

xinzaibing8 11 月, 2011 at 2:05 下午

建议你看看《大话设计模式》,就很清楚了

Xu Haojie8 11 月, 2011 at 3:18 下午

Thanks!

Leave a comment

Your comment