依赖与构成之间的区别?

dan*_*vic 12 java oop dependencies uml composition

定义取自这里

依赖

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

组成

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

组成

final class Car {

  private final Engine engine;

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

  void move() {
    engine.work();
  }
}
Run Code Online (Sandbox Code Playgroud)

mea*_*ers 22

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

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

  • 组成:在这里你看到里面Engine创建了一个新的.该对象是其中的一部分.这意味着,被构成的. CarEngineCarCarEngine

  • 所以依赖==聚合?http://stackoverflow.com/questions/11881552/implementation-difference-between-aggregation-and-composition-in-java/12431359#12431359 (2认同)

The*_*ind 7

简单的说 :

多亏了Marko Topolnik...

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

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

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

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

  • 引用自己的评论:*典型的例子:生产者/消费者模式*.生产者和消费者都聚合了一个*Queue*对象,但是否则完全解耦并且不相互了解*.但是,更改Producer的行为将影响(并可能破坏)Consumer的行为. (3认同)