聚合关系与组合关系有什么区别?

来源:互联网 发布:淘宝清仓冬装 编辑:程序博客网 时间:2024/05/16 01:46

聚合
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

组合
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;


在UML的概念里,没有什么单向聚合的概念。聚合是一种二元的关联关系,关联的一端是聚集(整体),另一端是组成(部分)。两端不能同时是聚集或者同时是组成。站在你的问题的角度,也就是说所有的聚合都是单向的,不存在所谓的双向聚合。   
   至于对聚合的理解,打一个比方,如圆和点的关系就是一种聚合关系。圆需要点,且是点的积聚。但点并不依赖于圆,且可以独立存在。但圆和圆心(一种特殊的点)的关系则不是聚合,因为圆心不能独立于圆存在,没有圆,圆心也就失去了意义,它们之间实际上是一种组合关系(一种具有更强约束的聚合)。部分能否独立存在,是聚合与组合的最重要的区别。   
   对应到代码上,我觉得应该是下面的形式:   
   class    A    (组成)   
   {   
   };   
   class    B    (聚集)   
   {   
     A    *a;   
   };

   聚合是指一个对象拥有另一个对象,仅强调“拥有”。而组合是指一个对象是另一个对象的一部分,强调“不可分割”,两个对象具有相同的生命周期。两者的差别就好比创立一间公司时您可以不要雇员(拥有),但创造一个人时您却不能丢掉了他的心(不可分割)。   
    
   关联和依赖都是指一个对象知道另一个对象。区别在于关联是一种结构关系,表现为一个对象能够获得另一个对象的实例引用并调用它的服务(即使用它);依赖是一种使用关系,表现为一个对象仅仅是调用了另一个对象的服务。

关联:表示类与类之间的连接。它使一个类的可见属性和方法被另一个类使用。关联可以是双向或者单向的。双向的关联箭头是可选的,单向的箭头指向遍历或者查询的方向。   
    
   聚合是关联的一种形式,代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别.   
    
   组合是聚合的一种特殊形式,暗示“局部”在“整体”内部的生存期职责。组合关系是不能共享的。所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。

请问组合聚合的区别

   关联更有利于描述对象关系,而聚合更利于区分内部对象与外部对象。
① 聚合(has a)
又分为 一般聚合 和 组合 (狭义的关联)出现的场合很多
组合——外部对象负责管理内部对象的生命周期

例子:人和手 是组合关系     手是人的附属品   最强的has a
       人             (外部对象生命周期)
       手             (内部对象生命周期)


② 依赖(use a)   

用例子区别:依赖、聚合、组合
人 和 车
A. 租车(依赖关系) 车还后,就没有车的引用了;
B. 买车(聚合关系) 不负责管理车的生命周期;
C. 人挂了,车也一起埋了(组合) 完全的附属品。

原创粉丝点击