论坛首页 Java企业应用论坛

"组合"&“聚合”之浅见

浏览 5927 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-19   最后修改:2009-05-19
OO

 

    组合和聚合是比较容易混淆的两个关系,二者有很大的相似性。其中聚合指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中包含组成分为部分等词常意味着聚合关系。也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。聚合和组合的主要区别在于聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

    从Java代码上来讲,我觉得组合可以看作聚合的特殊情况,组合的代码可通过两种方式来实现:

1)部分对象作为整体对象的成员变量而存在,随着整体对象的初始化,所有的部分对象也一并进行初始化,当整体对象被垃圾回收时,作为成员的部分对象也会同时被销毁;

2)部分对象作为整体对象的内部类的实例而存在。

聚合的代码也可以通过两种方法来实现:

1)部分对象作为整体对象的成员变量,与组合的代码类似;

2)整体对象中维护部分对象的指针变量,部分对象的实例化操作在类的外部进行,所以部分类的生命周期不会受整体类直接影响。

   发表时间:2010-04-26  
觉得作者的观点与thinking in java有出入,
聚合关系应该是是“contains-a”关系,组合关系是“has-a”关系
参看java编程思想第四版(英文版)31页。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics