UML Class Diagram 体现 Class 之间的关系,Generalization 和 Realization,这两种非常常见,Java 编程语言对应extends 和 implements,余下的还有四种,分别是:Dependency, Association, Aggregation, Composition。

在余下的四种关系中 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的关键点在于成员函数的参数。在这里又要注意一个概念,依赖注入,这个和依赖是不同的,依赖注入是通过参数注入的方式,来实现内聚等功能,来达到使用成员变量去实现的目的。

继续看 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表示整体/部分关系,而associations不是。然而,在实现这两种关系的方式上却没有多大差别。光从代码角度去确定一个特殊关系应该是aggregation或是association是非常难的。

从理论上讲,Aggregation 和 Association 的区别在于前者强调的是整体和部分的关系,但这在代码上是很难区分的。

Composition 和 Aggregation 的区别在于前者强调 lifetime,就是由我才有你。

有了这个基础,我们看个例子

1. Dependency - Person and his Keys. - 当人要开门的时候,执行开门这个动作(函数),并出入特定的钥匙(参数),并且没有把钥匙看作是人的类中的一个成员变量。
2. Association - Credit Card and Person. - 一个人可以有信用卡,也可以没有信用卡,信用卡对于一个人来说可有可无,而且更称不上人的一部分。has的关系
3. Aggregation - Order and Order Lines. - 订单(Order)是订单处理流(OrderLine)所必需的一部分。没有Order的话,OrderLine就没有了实际意义。同时这个Order可能属于多种不同的OrderLine。
4. Composition - Human Body.  - 人的身体,是一个人的一部分,并且不可能属于其他人,只是自己。has关系

Dependency与Aggregation、Association和Composition的角色分析。

Dependency是一种外界(B类)如何对内部(A类)影响的方式(也可以说进入的方式)。

而后面三种是外界(B类)与内部(A类)的关系。

接下来看下面的图

UML Class Diagrams 实例

上图纤细标明了各类间的关系。其中Car和Petrol的关系,我个人觉得应该是一个Aggregation关系。同时,我对于其中他将Country作为Family的Composition我也觉得不妥。但是具体怎么设计关键还是看当事人对类的理解。按照上图的理解是一个家庭可具有属性为0..1个人,一个国家可具有属性为1...*个家庭。把菱形念成“具有属性为”,把的数字认为是最近的那个类的个数。这里就是1个(这个一个是隐含体现在途中的) 家庭 可具有属性为 多个 人 。

单箭头和无箭头,单箭头表示单项,无箭头表示双向

最后来一个个人觉得最精辟的解释(园子里看到的):

两个类之间的关系,例如类A和B。
如果是B是A成员变量,而且B在A的构造函数中生成(new),那么就是Composition。

(解释:因为Composition是强相关与整体的东西,也就是说不和构造函数一起new出来的话,那么new出来的那个类是不完整的。(比如Person的HumanBody,不new Body怎么会是正常人。))
如果是B是A成员变量,而且B不在A的构造函数中生成(new),而是在有需要的时候才new,那么就是Aggregation。

(解释:这里体现的概念是和上面不同的,Aggregation的东西,是表示与new出来的类是松散关系的,不影响他的有无。(比如Person的Credit Card,不new Credit Card还是人))
如果A在某个函数中使用了B作为局部变量,那么就是Dependency。

(解释:这只是种方式,比如我可以作为构造函数的参数传入,那么就是Composition依赖注入,如果作为普通函数的参数,那么就有可能是Aggregation的依赖注入)

设计的时候是反过来,先决定这两个类之间的关系,在有编程语言的实现。

转载于:https://www.cnblogs.com/JosephLiu/archive/2011/10/14/2211403.html

Dependency, Association, Aggregation Composition的四种区别相关推荐

  1. Association, Aggregation, Composition, Abstraction, Generalization, Realization, Dependency

    Association, Aggregation, Composition, Abstraction, Generalization, Realization, Dependency 转自:http: ...

  2. 流媒体协议RTSP、HTTP、HTTPS、SDP四种区别解析

    了解了基本协议,我们在看代码写代码的过程中,就会有事半功倍的效果.下面主要讲解RTSP,HTTP,HTTPS, SDP四种协议,一起来看看了解下,仅供参考 一:RTSP协议简介 实时流协议RTSP是一 ...

  3. 四种DCOM错误的区别,0x80080005 0x800706be 0x80010105 0x

    四种DCOM错误的区别 Differences between the following DCOM error 0x80080005 0x800706be 0x80010105 0x800706ba ...

  4. 三星note5 android版本区别吗,三星Note5哪种颜色好看?三星Note5四种颜色区别对比图解...

    三星Note5有几种颜色?哪种颜色更好看呢?三星Note5是一款时下非常受欢迎的大屏旗舰手机,搭载Exynos 7422八核处理器,4GB超大内存,配备S Pen触控笔,支持指纹识别等特性,颇受消费者 ...

  5. 台湾积体电路制造公司(简称为台积电(TSMC))的28nm LP、HPM、HPC、HPC+四种不同处理器工艺版本的区别?

    台湾积体电路制造公司(简称为台积电(TSMC))的28nm LP.HPM.HPC.HPC+四种不同处理器工艺版本的区别? 说起处理器工艺,相信大家都多多少少知道一些,可同样的一种工艺,也会有很多不同版 ...

  6. vpwm的控制变频_变频V/F和矢量控制你知道区别吗?据说这四种控制没有几人能说清...

    一.三相异步感应交流电动机的工作原理 1.旋转磁场 在一个可旋转的马蹄型磁铁中间,放置一只可转动的笼型短路线圈.当转动马蹄形磁铁时,笼型转子就会跟着一起旋转.这是因为当磁铁转动时,其磁感线(磁通)切割 ...

  7. java中四种线程池的区别

    本文按: 一. 线程池的使用 二. 几种线程池的区别 三. 如何合理配置线程池 一.线程池的使用 在Java中,通常使用Executors 获取线程池.常用的线程池有以下几种: (1)CachedTh ...

  8. lvs工作在第几层_LVS 原理(调度算法、四种模式、四层负载均衡和七层 的区别)...

    目录 lvs的调度算法 lvs的四种模式 四层均衡负载和七层的区别 1.lvs调度算法(最常用的四种) 轮叫调度(rr) 调度器通过外部请求的顺序轮流分配到集群中的真实服务器上,对每台服务器都是均等的 ...

  9. java join()用法_四种联系(join)的区别及用法

    链接: 作为动词,它表示将两个或多个表的内容结合在一起并产生一个结果集,该结果集对每个表的列和行进行合并.表的联接一般都使用它们共有的数据.例如,您可以对有一个共同 pub_id 列的 titles ...

  10. C++的四种cast操作符的区别--类型转换

    C++的四种cast操作符的区别 发信站: 水木社区 (Thu Jan 26 21:15:16 2006), 站内 声明 by NetMD: 并非我的原创,来自互联网,且是两篇帖子的合集,个人觉得这样 ...

最新文章

  1. talib 中文文档(八): Momentum Indicator Functions 动量指标
  2. JPA扩展(自定义sql)
  3. [BZOJ 2425] 计数
  4. 监听某个区域滚动_监听页面滚动及滚动到指定位置
  5. 记录一次java.lang.ClassCastException的java类型转换异常解决方案-附最终解决方案
  6. SOA研究综述(转)
  7. DXperience中文视频教程(上)
  8. 实现WEB打印的几种方法
  9. dropout层加在哪里_神经网络Dropout层中为什么dropout后还需要进行rescale?
  10. python多进程协同_简单谈谈python中的多进程
  11. 关于符号Symbol第二篇
  12. 7-5 判断某整数是正整数、负整数还是零 (6分)
  13. VUE常用问题hack修改
  14. R语言运行环境安装配置
  15. 教你怎么不添加付款方式订阅苹果arcade
  16. 如何在PPT中插入LaTeX公式
  17. UCOSIII 系统内部任务
  18. 请更换备份电池 pos机_免费邮寄低费率POS机安全吗?为什么那么多免费POS机?请看视频...
  19. 斐讯N1保姆级教程 电视盒 debian centos7 三合一
  20. SketchUp Ruby二次开发

热门文章

  1. 机器视觉的发展现状和前景分析
  2. XStream 初探,很给力
  3. linux系统工程师修改打开文件数限制代码教程。服务器运维技术
  4. 6 - VC Bound (P[BAD]的真正上限)
  5. Linux系统用户账号的管理
  6. iPhone不送充电器?工信部发话了
  7. 原创整理:92份面试题,累计3625页,肝的太累了!
  8. 国外大神整理的 2019 年 Java 权威开发路线图,Java大神养成记
  9. 从滴滴亏109亿说起
  10. Android性能优化系列---管理你的app内存(二)