现在的位置: 首页 > 综合 > 正文

java 聚合与组合的区别

2014年01月09日 ⁄ 综合 ⁄ 共 2981字 ⁄ 字号 评论关闭

转载地址:http://hi.baidu.com/slijava/blog/item/bf6ff8ef85fa8137adafd5dc.html

组合,聚合的又一区别

组合聚合的主要区别
组合:异构性,部分和主体具有生命期上的一致性
聚合:同构性,主体和部分不具有生命期的一致性

我认为又一重大区别是(推论)
定义:
自组合,自聚合:自组合就是类型本身组合了自己的一个类型,自聚合就是类型本身聚合合了自己的一个类型。
推论:那么很明显,自组合是不成立的,这会引起循环构造,自聚合是成立的,聚合的过程和主体创建的过程在时间上是分离的。
应用:设计模式中singlton模式中,实例的类型如下
class T
{
      static T* m_instance;
}
这是自聚合的典型应用。

以上想法来自meyer的面向对象软件构造一书。

【begtostudy】:
聚和是拥有另一个对象的声明
比如汽车和轮子,

组合是使用另一个对象
比如飞机和飞机场

【yeahspyme】:
从所有权和生存期来区分
聚合关系包含所有权,被聚合对象的生存期最多和主体对象一起结束
组合则仅仅是知道另一个对象的存在,没有所有权。生存周期也可以无关。

【mythma】:
组合的范畴更广一些,可以认为:
聚合是一种特殊的组合.

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

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

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




聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。

组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。

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

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

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

转自:http://hi.baidu.com/%BD%BA%CB%AE502/blog/item/94573c6c187096f34216942a.html

经典说明:

转载地址:http://wenwen.soso.com/z/q178801871.htm

组合和聚合是有很大区别的,这个区别不是在形式上,而是在本质上:
比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象也同时消亡(没有任何一个引用指向它,成了垃圾对象),这种情况叫做组合,反之b所指向的对象还会有另外的引用指向它,这种情况叫聚合。
在实际写代码时组合方式一般会这样写:
A类的构造方法里创建B类的对象,也就是说,当A类的一个对象产生时,B类的对象随之产生,当A类的这个对象消亡时,它所包含的B类的对象也随之消亡。
聚合方式则是这样:
A类的对象在创建时不会立即创建B类的对象,而是等待一个外界的对象传给它
传给它的这个对象不是A类创建的。
现实生活中:
人和人和手,脚是组合关系,因为当人死亡后人的手也就不复存在了。人和他的电脑是聚合关系。

  1. class Hand{
  2. }
  3. class Computer{
  4. }
  5. 组合:
  6. class Person{
  7. private Hand hand;
  8. public Person(){
  9. hand = new Hand();
  10. }
  11. }
  12. 聚合:
  13. class Person{
  14. private Computer computer;
  15. public setComputer(){
  16. computer = new Computer();
  17. }
  18. }

【上篇】
【下篇】

抱歉!评论已关闭.