聚合和组合 的描述 及 在 java里的描述

1.聚合的定义

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

2.组合的定义

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

3.区别于联系

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

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

mark : 依赖,关联,聚合,组合
-->关联关系 由弱到强

4.实例描述

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

4.1 组合

package com.orclight.model.compVO;

/**
 * @Description:Hand
 * @author: orclight  
 * @since 2013-4-30 下午6:46:50
 * @version 1.0.0 
 */
public class Hand {

}

/**
 * @Description:Person 和 Hand 是组合关系(具有相同的)
 * @author: orclight  
 * @since 2013-4-30 下午6:46:36
 * @version 1.0.0 
 */
public class Person {
	private Hand hand;
	
	/**
	 * person 和 hand具有相同的生命周期
	 */
	public Person() {
		hand = new Hand();
	}
	
	public Hand getHand() {
		return hand;
	}
	public void setHand(Hand hand) {
		this.hand = hand;
	}
}

4.2 聚合

package com.orclight.model.aggVO;

/**
 * @Description:Computer
 * @author: orclight  
 * @since 2013-4-30 下午6:52:37
 * @version 1.0.0 
 */
public class Computer {

}

package com.orclight.model.aggVO;

import com.orclight.model.compVO.Person;


/**
 * @Description:Person 和 Computer是聚合关系
 * @author: orclight  
 * @since 2013-4-30 下午6:51:35
 * @version 1.0.0 
 */
public class Student extends Person{
	private Computer computer;
	
	public Student() {
	}

	public Computer getComputer() {
		return computer;
	}
	/**
	 * 
	 * setComputer(需要的时候再设置进去)
	 * @param computer 
	 * @return void
	 * @since  1.0.0
	 */
	public void setComputer(Computer computer) {
		this.computer = computer;
	}
}


参考 :1.http://topic.csdn.net/u/20090414/20/4d6f98c7-94aa-4e6c-be7c-88d9e3e15bdc.html

2.http://wenwen.soso.com/z/q178801871.htm

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...