我现在面临一个持续的问题相互区分代表团组成和聚集,并查明这是最好的使用了另一种情况。
我咨询一个Java面向对象分析与设计的书,但我的困惑仍然存在。 主要的解释是这样的:
代表团 :当我的对象使用另一个对象的功能是在不改变它。
组成 :我的目标是由这我对象被销毁,垃圾回收后,又可以不存在其他对象。
聚集 :我的目标是由我的对象被销毁之后,甚至可以住其他对象。
是否有可能有几个简单的例子展示了每一种情况下,和他们背后的原因? 还能如何这些例子证明不是简单地到另一个对象(或多个)参考我的对象等?
Answer 1:
你的对象将在这三种情况下引用另一个对象(或多个)。 不同之处在于行为和/或引用对象的生命周期。 一些例子:
组成:房子包含一个或多个房间。 房间的一生是由众议院控制,房间也不会没有房子存在。
聚集:玩具房子从模块构建。 您可以拆卸,但块将保持不变。
代表团:你的老板要求你让他一杯咖啡,你有一个实习生为你做吧。 团不关联的类型:(样组合物/汇聚是)。 后两者已经在堆栈溢出讨论很多次
在评论你问如何执行将在每种情况下不同,观察到在所有的情况下,我们调用的相关型号对象的方法。 这是真的,在每种情况下,我们会有这样的代码
myRoom.doWork();
myBlock.doWork();
myMinion.doWork();
但不同之处在于在相关对象的生命周期和基数。
对于组件,房间进入存在创建房子的时候。 因此,我们可能会在众议院的构造函数创建它们。
在协会的情况下(我会用轮胎和汽车),汽车可能会在其构造加上轮胎,但以后你可能需要删除和换胎。 所以,你也有方法,如
removeTyre(FrontLeft)
addNewTyre(aTyre, BackRight)
这是相当有可能的aTyre对象从工厂出来的-我们没有new
在任何汽车的方法吧。
在代表团的情况下,你甚至可能不会有一个成员变量保存委托
resourcingPool().getIntern().getCoffee(SkinnyLatte, workstation 7);
对象之间的关系,只要仅作为实习生取咖啡持续。 然后,它返回到资源池。
Answer 2:
代表团
public class A {
private B b = new B();
public void methodA() {
b.methodB();
}
}
当客户A
电话methodA
,类A
代表调用B
的methodB
。
基本原理。 A类暴露了属于其他地方的行为。 这可以在单继承语言,其中A类从一个类继承发生,但它的客户需要的是在不同的类中实现的行为。 进一步的研究 。
混合代表团
public class A {
private B b = new B();
public void methodA() {
b.methodB( this );
}
}
涉及简单的转发和代表团充当继承的替代代表团之间的区别是,被叫方必须接受来电,例举的参数:
b.methodB( this );
基本原理。 允许类B
情况下使用提供类的功能A
,就像类B
想如果从类继承的A
-但没有继承。 进一步的研究 。
组成
public class A {
private B b = new B();
public A() {
}
}
一旦类的特定实例不再引用A
存在,它的类的实例B
被破坏。
基本原理。 允许类以模块化的方式定义行为和属性。 进一步的研究 。
聚合
public class A {
private B b;
public A( B b ) {
this.b = b;
}
}
public class C {
private B b = new B();
public C() {
A a = new A( this.b );
}
}
一旦有类的特定实例不再引用A
,它的类的实例B
也不会被破坏。 在此示例中, A
和C
必须是垃圾收集之前B
将被破坏。
基本原理。 允许情况下重用的对象。 进一步的研究 。
演示无参考文献
给这些简单的模式的名称是由它们的引用关系定义。
Answer 3:
你的书解释相当不错,所以让我详细说明,并提供你一些例子。
代表团:当我的对象使用另一个对象的功能是在不改变它。
有时一类可能在逻辑上需要较大。 但大类是不是一个很好的编码实践。 也有时,一类的一些功能可能不止一种方式是可以实施的,你可能想改变这种状况一段时间。
class FeatureHolder {
void feature() {
// Big implementation of the feature that you dont want to put in the class Big
}
}
class Big {
private FeatureHolder FH = new FeatureHolder();
void feature() {
// Delegate to FeatureHolder.
FH.feature();
}
//.. Other features
}
从上面的例子,Big.feature()调用FH的特征,因为是在不改变它。 这样,类大并不需要包含的功能(劳动的分离)的实施。 此外,功能()可以通过像“NewFeatureHolder”和大可以选择使用新的功能,而不是持有其他类实现不同。
组成:我的目标是由这我的对象destryed,垃圾回收后,又可以不存在其他对象。
聚集:我的目标是由我的对象被销毁之后,甚至可以住其他对象。
Technially,成分和聚合“指的是”关系“的一部分。” 你的手臂是你的一部分。 如果你不再活,你的手臂将太死。 衣服上是不是你的一部分,但你有他们; 你可以客人,你的布不和你一起去。
在编程中,有些对象是另一个对象的一部分,他们有没有逻辑的意义离不开它。 例如,一个按钮被组合成一个窗框。 如果一个帧被关闭时,该按钮没有理由是围绕了(组合物)。 A按钮可以具有参照数据库(喜欢refreash数据); 当按钮被消除,数据库仍然可以为大约(聚合)。
对不起,我的英语水平,希望这有助于
Answer 4:
1)代表团:满驱动车的例子。 一名男子买了一辆车。 但是,男人不知道来驱动汽车。 于是,他将任命谁知道驾驶汽车司机。 于是男人类要执行用汽车运输。 不过,这并不有车interacting-功能/兼容性。 于是,他用它与汽车内驾驶员这是与人的类兼容兼容性的分类。 假设驾驶员能明白的人说:
2)组成:汽车仿真是一个常规例子。 为了使车移动,旋转轮。 用车轮类汽车类旋转functinality作为其移动功能,其中如车轮汽车的一部分的一部分。
3)聚合:汽车和它的颜色。 汽车类对象法拉利都会有色差类对象红色。 但颜色类对象红色可以有个别类,当用户搜索与红色的规范情况。
文章来源: Distinguishing between delegation, composition and aggregation (Java OO Design)