我理解的聚合,关联,组合区别

聚合,关联,组合 是对象之间的三种关系。从某种意义上说,继承是一种类的纵向关系,而聚合,关联,组合是对象的横向关系。


其关系强弱为 关联<聚合<组合

关联:在程序中相当于把已经实例化的对象A做为另一对象B方法的参数传递引用。

组合:即为内部类

聚合:其做法介于两者之间。不过我更觉得聚合相当于一个在外部已经申明的A,然后把A放在B中做为一个变量使用。

不知我理解的是不是正确,请大家从 **实现** 的角度发表一下意见吧。

聚合是1对多

1的那个要有一个collection储存多的那个


CC,抱歉的很,实在不能认同你的说法。

你说的只是聚合中的一种情况而已。

象组合的实现:内部类。 一个类里面也可以有多个内部类,这同样是一对多的关系。

不太理解,组合怎么会和内部类对应,我觉得组和纯粹表明的是一种对象之间的关系,而内部类在java中应该是一种多继承关系的某种实现?

没有你想象的那么复杂

组合就是一种很强烈的关联,必须在被组合对象生成的时候,组合对象也就必须生成了

像这样



public class a{

Collection bs = null;

public a(){
bs = new Collection();
bs.add(new b());
}

}

public class b{

}


刚才找了一些内部类的资料,发觉我的理解有点不对。

因为内部类如果不是静态申明的话,必须被实例化后才能得到内部类对象。所以内部类可以与包容它的外部类有不同的生命周期。

其实我也只是想从实现的角度去认识 这三种强弱关系的不同。

CC,概念容易理解,你说的没错“组合就是一种很强烈的关联,必须在被组合对象生成的时候,组合对象也就必须生成了”,“组合”例子的代码
容易实现, 但“聚合”,“关联”的代码如何写才能区别出三者强弱关系呢?

请各位道友写几笔示意代码,让大家看看。

聚合主要反映一种整体-部分的关系,组合反映某部分只能属于某整体(强聚合),他们在代码上是看不出分别的。

To Bruce,
我认为从代码的角度理解聚合、关联关系完全是错误的。给你一段代码:
public class A {
private B ref;
public A( B ref ) {
this.ref = ref;
}
...
}
你怎么知道class A和class B是什么关系? 既可以是关联关系,也可以是合成关系,也可以是聚合关系。我觉得这三者要从语义上去理解。

同意wwlhp@jdon.com ,我觉得3种关系都能产生
public class A {
private B ref;
public A( B ref ) {
this.ref = ref;
}
...
}
public class B{
...
}
应该从语意,内涵上去理解。比如:
关联:人->习惯,可有可无的东西
聚合:多边形<>->边,角 关系不是很紧密
组合:圆《》->圆心,圆弧 圆由圆心和圆弧组成

多谢楼上几位的回复,基本同意各位的见解。仔细想了一下,觉得要写代码,的确变化比较多,这也是我开始为什么想从实现上分析这三种关系的原因。
尽管实现方式很多,但我还是写了一种实现的代码,我没有写 把对象做为参数传递的情况,不过下面的代码道理是一样的。

======
组合
======
public class A {
//Constructor function must include B and C, all of them have the same life cycle.
public A() {
B b = new B();
C c = new C();
}
...
}
public class B{
}
public class C{
}
======
聚合
======
public class A {
public A() {
}
/* This method is a must method in class A, but this method is called after the constructor function is finished. So A and B,C have the different life cycle. Class A could exist without B,C*/

public void MethodOfA(){
B b = new B();
C c = new C();

}
public class B{
}
public class C{
}
========
关联
========
public class A {
public A() {
}

/* This method is not a must method in class A
Class A only have association with B C when this method is called
*/

public void Method-need-BC(){
B b = new B();
C c = new C();

}
public class B{
}
public class C{
}

楼上哥们写的我觉得是:依赖关系,符号------>

我认为逻辑上,越来越强。但是,实现上是一样的,没有区别。

我不懂,我查书

Association:
Uses the services of another class

Aggregation:
A class “owns” another class

Composition:
A class is composed of another class; refers to an aggregation within which the component parts and the larger encompassing whole share a lifetime

在我感觉 ,以上的关联应该是依赖 ,而聚合与组合在实现上没什么区别的,在逻辑上的区别就是依赖的强弱 ,聚合---当整体消失 ,而部分可以存在 ,但是组合----整体消失 ,部分页消失 ,不知各位同意否?写出来在于共同提高 ,有错 ,各位指出.

F