代表团组成和聚合区分(Java的面向对象的设计)(Distinguishing between de

2019-07-05 01:48发布

我现在面临一个持续的问题相互区分代表团组成和聚集,并查明这是最好的使用了另一种情况。

我咨询一个Java面向对象分析与设计的书,但我的困惑仍然存在。 主要的解释是这样的:

代表团 :当我的对象使用另一个对象的功能是在不改变它。

组成 :我的目标是由这我对象被销毁,垃圾回收后,又可以不存在其他对象。

聚集 :我的目标是由我的对象被销毁之后,甚至可以住其他对象。

是否有可能有几个简单的例子展示了每一种情况下,和他们背后的原因? 还能如何这些例子证明不是简单地到另一个对象(或多个)参考我的对象等?

Answer 1:

你的对象将在这三种情况下引用另一个对象(或多个)。 不同之处在于行为和/或引用对象的生命周期。 一些例子:

  1. 组成:房子包含一个或多个房间。 房间的一生是由众议院控制,房间也不会没有房子存在。

  2. 聚集:玩具房子从模块构建。 您可以拆卸,但块将保持不变。

  3. 代表团:你的老板要求你让他一杯咖啡,你有一个实习生为你做吧。 团不关联的类型:(样组合物/汇聚是)。 后两者已经在堆栈溢出讨论很多次

在评论你问如何执行将在每种情况下不同,观察到在所有的情况下,我们调用的相关型号对象的方法。 这是真的,在每种情况下,我们会有这样的代码

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 代表调用BmethodB

基本原理。 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也不会被破坏。 在此示例中, AC必须是垃圾收集之前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)