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

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

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

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

组合:即为内部类

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

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

1
cc
2003-06-18 08:44
聚合是1对多

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

bruce
2003-06-18 10:02

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

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

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

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

cc
2003-06-18 11:09
没有你想象的那么复杂

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

像这样


public class a{

   Collection bs = null;

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

}

public class b{

}


<p>

bruce
2003-06-18 12:08
刚才找了一些内部类的资料,发觉我的理解有点不对。

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

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

CC,概念容易理解,你说的没错“组合就是一种很强烈的关联,必须在被组合对象生成的时候,组合对象也就必须生成了”,“组合”例子的代码

容易实现, 但“聚合”,“关联”的代码如何写才能区别出三者强弱关系呢?

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

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

wwlhp@jdon.com
2003-06-18 13:26
To Bruce,

我认为从代码的角度理解聚合、关联关系完全是错误的。给你一段代码:

public class A {

private B ref;

public A( B ref ) {

this.ref = ref;

}

...

}

你怎么知道class A和class B是什么关系? 既可以是关联关系,也可以是合成关系,也可以是聚合关系。我觉得这三者要从语义上去理解。

jiangxi
2003-06-18 16:43
同意wwlhp@jdon.com ,我觉得3种关系都能产生

public class A {

private B ref;

public A( B ref ) {

this.ref = ref;

}

...

}

public class B{

...

}

应该从语意,内涵上去理解。比如:

关联:人->习惯,可有可无的东西

聚合:多边形<>->边,角 关系不是很紧密

组合:圆《》->圆心,圆弧 圆由圆心和圆弧组成

bruce
2003-06-18 23:20
多谢楼上几位的回复,基本同意各位的见解。仔细想了一下,觉得要写代码,的确变化比较多,这也是我开始为什么想从实现上分析这三种关系的原因。

尽管实现方式很多,但我还是写了一种实现的代码,我没有写 把对象做为参数传递的情况,不过下面的代码道理是一样的。

======

组合

======

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{

}

jiangxi
2003-06-19 08:23
楼上哥们写的我觉得是:依赖关系,符号------>

SUPERMY
2003-06-19 11:05
我认为逻辑上,越来越强。但是,实现上是一样的,没有区别。

ripper
2003-06-23 16:00
我不懂,我查书

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

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

olderYan
2003-07-03 13:56
F

猜你喜欢
2Go 1 2 下一页