【问题标题】:Difference between dependency and composition?依赖和组合之间的区别?
【发布时间】:2014-01-28 02:37:49
【问题描述】:

Definitions taken from here

依赖

一个类的结构或行为的变化会影响其他相关的 类,那么这两个类之间存在依赖关系。它需要 不一样,反之亦然。当一个类包含另一个类时 发生这种情况。

作曲

组合是聚合的一种特殊情况。在更具体的 方式,受限聚合称为组合。当一个物体 包含另一个对象,如果包含的对象不存在 不存在容器对象,则称为 作文。

来自herehere的Java具体示例

依赖

class Employee {
    private Address address;

    // constructor 
    public Employee( Address newAddress ) {
        this.address = newAddress;
    }

    public Address getAddress() {
    return this.address;
    }
    public void setAddress( Address newAddress ) {
        this.address = newAddress;
    }
}

作曲

final class Car {

  private final Engine engine;

  Car(EngineSpecs specs) {
    engine = new Engine(specs);
  }

  void move() {
    engine.work();
  }
}

【问题讨论】:

  • 这很有趣。那里有问题吗?
  • 可能在标题中
  • 这些定义的质量很差。示例:“...这两个类之间的依赖关系”“它不必是相同的,反之亦然”但是“之间”是一种无向关系——它是相同的,反之亦然 根据术语的定义 之间.
  • 你能给我一个代码示例吗:)
  • @MarkoTopolnik 一个依赖和组合的例子,我可以清楚地理解差异。如果可能的话在代码中

标签: java oop dependencies uml composition


【解决方案1】:

简单地说:

感谢Marko Topolnik 的这个...

  1. Dependency 在一个对象“依赖”于另一个对象时出现。它可以在两个对象之间有或没有关系的情况下发生。实际上,一个对象甚至可能不知道另一个对象的存在,但它们可能是依赖的。 示例:生产者-消费者问题。生产者不需要知道消费者存在,但它必须执行 wait() 和 notify()。所以,“NO”,依赖不是关联的子集。

  2. Composition :是一种关联类型,其中“子”对象在没有父类的情况下无法存在。即,如果子对象存在,那么它必须在父对象中,而不是其他任何地方。

    EG:汽车(父)具有燃油喷射系统(子)。现在,在车外安装燃油喷射系统是没有意义的(它没有用处)。即,没有汽车,燃油喷射系统就无法存在。

  3. Aggregation :这里,子对象可以存在于父对象之外。 汽车有司机。驾驶员可以存在于车外。

【讨论】:

  • 所以你是说组合是依赖的子集?
  • 是的...依赖是一个通用术语。组合/聚合/继承导致依赖。虽然我认为关联是一个更好的术语,而不是依赖。
  • 你能告诉我这个的来源吗?因为我得到的两个答案是相互矛盾的。此外,它们在 UML 中的表现也有所不同,例如应该在类图中使用哪一个?
  • 如果依赖的定义是“结构/行为的变化影响一个类”,那么类之间就必须没有聚合或任何其他类型的关系。例如,他们可能都访问同一个第三个对象,并且必须就他们使用该对象的方式达成一致。典型示例:生产者/消费者模式。
  • 从上述评论中引用我自己的话:典型示例:生产者/消费者模式。生产者和消费者都聚合一个 Queue 对象,但在其他方面完全解耦并且彼此不知道。但是,改变生产者的行为会影响(并可能破坏)消费者的行为。
【解决方案2】:

在两个构造函数中可以看出区别:

  • 依赖Address 对象来自外部,它被分配到其他地方。这意味着AddressEmployee 对象是分开存在的,并且只是相互依赖

  • Composition:在这里您可以看到在内部 Car 创建了一个新的EngineEngine 对象是Car 的一部分。这意味着CarEngine组成

【讨论】:

  • @dani-h 不,aggregationcomposition 描述了事物是如何构建/结构化的,而 dependency 更多的是某种结构的属性。请参阅@TheLostMind 的最佳答案。
【解决方案3】:

依赖是指仅在函数范围内使用对象。换句话说,类的实例只存在于包含类的函数(或方法)中,并在函数退出后被销毁。

您为依赖关系提供的示例不是依赖关系,因为 Employee 类包含地址的实例,这称为聚合。聚合类似于组​​合,除了对象也可以存在于使用它的类之外。 (它可以位于类范围之外)。 在您的示例中,您将 Address 的副本传递给 Employee 构造函数。但由于它是在 Employee 对象之外创建的,因此 Address 也可能存在于程序中的其他位置。

与聚合一样,组合是组件对象可用于整个复合对象的地方。这意味着复合对象的所有方法/函数都可以访问组件对象。 Aggregation 和 Composition 之间的唯一区别在于,在 Composition 中,组件对象仅存在于复合对象内部,而在程序中的其他任何地方都不存在。所以当复合对象被销毁时,给定的组件对象也被销毁,并且不能存在于其他任何地方。在您的示例中,The Car 是一个复合对象,而 Engine 是一个组件,因为 Engine 的该实例仅存在于该特定 Car 中,而在其他任何地方都不存在。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2018-10-20
    • 2020-04-26
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多