依赖与构成之间的区别?

时间:2014-01-09 13:47:27

标签: java oop dependencies uml composition

Definitions taken from here

依赖

  

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

组合物

  

组合是聚合的特例。更具体一点   方式,限制聚合称为组合。当一个对象   如果包含的对象不存在,包含其他对象   如果没有容器对象,则调用它   组合物。

来自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();
  }
}

3 个答案:

答案 0 :(得分:19)

可以在两个构造函数中看到差异:

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

  • 撰写:您在此处看到 Engine内创建了新的CarEngine对象是Car的一部分。这意味着Car的<{1}} 组成

答案 1 :(得分:7)

简单地说:

感谢Marko Topolnik为此......

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

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

    EG:汽车(父母)有燃油喷射系统(儿童)。现在,在汽车外面安装燃油喷射系统是没有意义的(这是没用的)。也就是说,没有汽车就不能存在燃油喷射系统。

  3. Aggregation:这里,子对象可以存在于父对象之外。 一辆车有一个司机。司机CAN存在于车外。

答案 2 :(得分:0)

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

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

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