我正在尝试确认我对代码对于关联,聚合和&的代码的理解。组成。所以这里...... ..
聚合:Has-a。 是另一种类型的现有对象
public class Aggregation
{
SomeUtilityClass objSC
public void doSomething(SomeUtilityClass obj)
{
objSC = obj;
}
}
合成:由另一个对象组成
public class Composition
{
SomeUtilityClass objSC = new SomeUtilityClass();
public void doSomething()
{
objSC.someMethod();
}
}
协会:我对此有两种看法。
关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。
public class Association
{
//SomeUtilityClass objSC /*NO local reference maintained */
public void doSomething(SomeUtilityClass obj)
{
obj.DoSomething();
}
}
我的理解是否正确?我阅读了有争议的文章here和here,所以我真的不确定应该遵循哪一条。我的理解似乎与第一个链接一致。我觉得第二个环节是错误的,或者也许我还没有理解它。
你怎么看?答案 0 :(得分:54)
对于两个对象Foo
和Bar
,我们有:
<强>相关性:强>
class Foo
{
...
fooMethod(Bar bar){}
...
}
<强>协会强>
class Foo
{
private Bar bar;
...
}
成分:(当Foo
死亡时Bar
)
class Foo
{
...
private Bar bar = new Bar();
...
}
聚合:(当Foo
死亡时,Bar
可能会继续存在)
class Foo
{
private List<Bar> bars;
}
答案 1 :(得分:21)
聚合和组合之间的差异非常模糊,AFAIK与容器被销毁后“子”对象的逻辑存在有关。因此,在聚合的情况下,容器内的对象在容器对象被销毁之后仍然可以存在,而在组合设计的情况下,它们也被销毁。一些类比:
Car
个对象的Wheel
对象。通常情况下,如果你摧毁汽车(通过调用一些方法来清理它),你也应该在过程中摧毁车轮,因为它们在车外存在是没有意义的(除非你把它们移到另一个Car
宾语)。更现实地说,包装输入流的读取器对象也将在其自身关闭时关闭内部流。这是组合。Person
对象包含(拥有)Radio
个对象。如果Person
死亡,Radio
可能会被另一个Person
继承,即在没有原始所有者的情况下存在它是有意义的。更现实地,列表保持对象不要求在放置列表本身时处理所有对象。这是聚合。编辑:在阅读完链接后,我倾向于选择第一个链接,因为它给出了类似于我的解释。
关联只是通过对该对象的引用来调用另一个对象的方法(发送消息)。
答案 2 :(得分:0)
如果继承给我们 'is-a'
而组合给我们 'part-of'
,我们可以说聚合给我们一个 'has-a'
关系。
==> 简而言之,关联、聚合和组合是表示对象之间关系的术语。
"uses"
另一个对象。正如您所说:“关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。”public class Association
{
//SomeUtilityClass _obj /*NO local reference maintained */
public void doSomething(SomeUtilityClass obj)
{
obj.DoSomething();
}
}
"has-a"
关系(white diamond)
public class Address
{
. . .
}
public class Person
{
private Address address;
public Person(Address address)
{
this.address = address;
}
. . .
}
如您所见,Person 并不管理 Address 的生命周期。如果 Person 被销毁,Address 仍然存在。
'part-of'
关系(dark diamond)
。例如:发动机是汽车的一部分public class Engine
{
. . .
}
public class Car
{
Engine e = new Engine();
.......
}
请更喜欢以下链接以获取未来信息: