组合和聚合的关系很像,但是又有着本质区别。
先把下面总结好的两句话放在文章的开头:
- 组合的关系是A拥有B的全部生命周期,B就是A的一部分,切B的对象只能被A的一个对象拥有而不能共享。new A()的时候,B的对象随之产生,当A的一个对象消亡,随之使用的b对象也会跟着消亡。
- 聚合的关系是,A拥有B,但不拥有全部,也不是必须拥有,A与B之间是可以分离的,是两个单独的个体,各自拥有各自的生命周期。B不属于A,A把B拿过来只是借用了B一下,或者B需要使用A中的一部分实现而把自己嵌进去了,这个活干完了,大家各回各家,各找各妈。
他们两个的区别其实通过代码不是能很明显的看出来,但是你在写代码的初衷动机不一样。比如你想用A类接收别人传给你的消息,同时A包含B,那么他们的目的就是接收消息仅此而已,B不会再有其他的作用,它完全属于A;但是这两个类在你创建的时候他们本身没有关系或者有着千丝万缕的关系,但是初衷就不是B属于A,而是他们为了实现一个功能而相互需要,相爱相杀。
组合【也称为强聚合,有着contains-a的关系】
比如你写一个类A,一个类B。A里边包含一个属性B b;如下:
/**
* 组合
*/
public class A {
private B b;
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
public void aaa(){
System.out.println("虽然类A有一个属性是B,但是却没有使用B");
System.out.println("对象b会随着A的消亡而消亡");
}
}
组合的关系是A拥有B的全部生命周期,B就是A的一部分,切B的对象只能被A的一个对象拥有而不能共享。new A()的时候,B的对象随之产生,当A的一个对象消亡,随之使用的b对象也会跟着消亡。
聚合【有着has-a的关系】
仍然是一个类A,引入了对象B,并且使用了对象B的方法。
/**
* 聚合A类
*/
public class A {
private B b;
public A(B b) {
this.b = b;
}
public void aaa() {
System.out.println("虽然类A有一个属性是B,但是却没有使用B");
A a = new A(b);
b.pri();
}
}
/**
* 聚合B类
*/
public class B {
public void pri() {
System.out.println("B也有自己单独的方法和作用");
}
}
聚合的关系是,A拥有B,但不拥有全部,也不是必须拥有,A与B之间是可以分离的,是两个单独的个体,各自拥有各自的生命周期。B不属于A,A把B拿过来只是借用了B一下,或者B需要使用A中的一部分实现而把自己嵌进去了,这个活干完了,大家各回各家,各找各妈。