总结一下聚合和组合的关系。

组合关系(Composition):部分和整体之间具有相同的生命周期,当整体消亡后,部分也将消亡。就像大雁的翅膀和大雁是组合关系。代码实现时,部分类在整体类的构造函数中被构造,在析构函数中被析构。

聚合关系(Aggregation):部分与整体之间并没有相同的生命周期,整体消亡后部分可以独立存在。就像大雁和雁群是聚合关系。代码实现时,整体类中传入一个部分类的指针,部分类已经在整体类外被构造,因而在整体类析构的时候,部分类并没有被析构。

聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用。

聚合,关联,组合 是对象之间的三种关系。从某种意义上说,继承是一种类的纵向关系,而聚合,关联,组合是对象的横向关系。

其关系强弱为 关联<聚合<组合

关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。聚合和组合的区别则在语义和实现上都有差别,组合的两个对象之间其生命期有很大的关联,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象,例如一个文档的版本,必须依赖于文档的存在,也只能属于一个文档。聚合则不一样,被聚合的对象可以属于多个聚合对象,例如一个员工可能可以属于多个公司。



例如树的存储结构设计中,通用树结点组合使用了单链表对象,通用树聚合使用了通用树节点。
前者是大雁与大雁的翅膀的关系,后者是雁群与大雁的关系。

UML中的聚合与组合相关推荐

  1. DDD中的聚合和UML中的聚合以及组合的关系

    UML: 聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在. 如汽车(Car)与引擎(Engine).轮胎(Wheel).车灯(Light)之间的关系为聚合关系,引擎.轮胎.车灯 ...

  2. 浅谈UML中的聚合与组合

    欢迎大家关注我的新书<Spring Boot趣味实战课> 京东 当当 天猫 ​ 大家都知道UML的类图中一般包含五种关系即  关联 聚合 组合 泛化 依赖  有些人可能会感觉组合跟聚合有点 ...

  3. Java中的聚合与组合

    一.聚合与组合 继承是面向对象编程三大特性之一,通过继承,子类可以继承父类非private的属性和方法,大大提高代码复用性和开发效率. 但继承也有众多缺点, 比如使得子类与父类过度耦合,当父类发生调整 ...

  4. uml 类图聚合与组合

    聚合 聚合是关联关系的一种特例,他体现的是整体与部分.拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享:比如 ...

  5. UML中聚集(Aggregation)与组合(Composition)的区别

    UML中,聚集和组成是两个十分相似的概念.书上这样说:聚集是关联中的一种,聚集对象由部分对象组成:组合又是一种特殊的聚集.在一个组合对象中,部分对象只能作为组成对象的一部分与组合对象同时存在. 即是说 ...

  6. 详解UML中的聚合,关联,泛化等关系

    1. Overview UML设计类中,类的关系分为Generalization(泛化),Dependency(依赖关系).Association(关联关系).Aggregation(聚合关系).Co ...

  7. 继承、实现、依赖、关联、聚合、组合的联系与区别

    继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系:在Java中此类关系通过关键字extend ...

  8. UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别

    zz from: http://dev.firnow.com/course/3_program/java/javajs/20090219/155939.html UML中几种类间关系:继承.实现.依赖 ...

  9. UML中关联,聚合,组合的区别及C++实现

    类间关系 在类图中,除了需要描述单独的类的名称.属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义.在UML类图中,关系用类框之间的连 ...

最新文章

  1. usaco window arear(递归求矩形覆盖面积)
  2. Attach()和Detach()函数
  3. UIColor之【扩展:#FFFFFF -UIColor】
  4. 抓住县域消费者的“胃”,淘特凭什么?
  5. Python教程:文件路径/目录获取教程
  6. 京瓷1020怎么打印自检页_[建筑]喷墨打印机如何打印自检页 详细
  7. python学习——matplotlib库——折线图
  8. sqlserver sql行专列_Sqlserver 列转行 行转列
  9. 现代信号处理 张贤达_著名科学家、清华大学张贤达教授逝世,享年 74岁
  10. ddl是什么意思(ddl是什么意思(网络语ddl是什么梗))
  11. 计算机存储单位t代表什么意思,存储单位是什么
  12. 游戏设计自学记录(20)
  13. Python爬虫:爬取某鱼颜值主播MM图片,你的最爱!?
  14. 基于JSP心悦图书城系统设计与实现
  15. 2007-11-20 多普达828+不完全技术分析 [zozo转及对话]
  16. [刷题]2017百度之星资格赛 - 度度熊与邪恶大魔王
  17. 银河大百科【宇宙的数量级】
  18. 聚类分析经典算法(一)
  19. 二进制文件和 ASCII
  20. 小程序之switch...case...break

热门文章

  1. org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.fs.FileAlreadyExistsException)
  2. Nokia xl 4G 主内存卡切换
  3. 圈点生活......
  4. PAT 1029 旧键盘
  5. Open Set Domain Adaptation
  6. python 如何安装PCV库
  7. ECIF和CRM区别 (转)
  8. day4.字符串练习题
  9. 安卓仿写多玩的《英雄联盟盒子》系列源码(一)——效果预览与前言
  10. springboot增加tp90监控