我一直在阅读有关构图和聚合的内容。我想我理解两种不同关系类型的基本原理。然而,它在代码中的实际外观仍然不清楚。
如果你有一个复合对象,这是否意味着你永远不会在正在定义的复合对象之外写new OtherObject()
?您永远不会将类型OtherObject
的引用传递给复合对象,它是在内部维护的吗?
您传递引用的所有情况是否正确,您不再处理合成而是聚合?两者之间的界限在哪里?我不明白你何时可以谈论作为作品一部分的对象的规则。
答案 0 :(得分:4)
组合是一种强大的关联。
聚合是弱关联。
聚合是关联的特例。对象之间的方向关联。当一个对象'拥有'另一个对象时,你就会在它们之间得到一个聚合。它们之间的方向指定哪个对象包含另一个对象。
合成是聚合的特例。以更具体的方式,受限制的聚合称为组合。当一个对象包含另一个对象时,如果所包含的对象不存在而没有容器对象,那么它就称为合成。
组合是一个关联,其中包含对象b
负责所包含对象a
的生命周期。如果将已创建的对象a
的引用传递给另一个对象b
,则b
无法控制a
的生命周期。这意味着{{1即使没有a
,也可以存在。
b
此处class A {
B b ;
A(B b ) { this.b = b; }
}
的存在不依赖于b
,但a
确实包含A
的对象。聚合。
B
此处class A {
B b ;
A() { b = new B();}
}
取决于b
对象的存在。如果没有A
的对象,则也没有A
的对象。的组合物。强>
答案 1 :(得分:0)
考虑以下
这是组合的示例。 B与A相关联,以便在没有A
的情况下不能存在 Class A{
B b = new B();
}
如果你创建了类A
的对象,那么也会创建B,如果A被销毁,那么B也会被销毁。
考虑聚合的示例。 B与A相关但可以与A
相关联 Class A{
C c = new C();
B b = c.someMethodThatReturnsExistingBObject();
}
class C{
B b = new B();
public B someMethodThatReturnsExistingBObject(){
return b;
}
}
然后这将返回一个具有外部引用的对象。即它仍然生活在这个班级之外。因此,即使A对象被破坏,B对象也将存在于外部。
您传递引用的所有情况是否正确,您不再处理合成而是聚合?
是的,因为组合的含义是对象没有任何外在存在。一旦传递引用,它将被视为aggregation
,因为在传递引用时,您将外部对象传递给它,它将从外部存在,因为它是从外部传递的。