依赖与构成之间的区别?

定义取自这里

依赖

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

组成

组合是聚合的特例。 以更具体的方式,受限制的聚合称为组合。 当一个对象包含另一个对象时,如果所包含的对象不存在而不存在容器对象,那么它就称为组合。

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

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

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

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

简单的说 :

感谢Marko Topolnik为此……

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

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

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

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

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

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

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