Java 依赖和组合之间的区别?

Java 依赖和组合之间的区别?,java,oop,dependencies,uml,composition,Java,Oop,Dependencies,Uml,Composition,依赖性 class Employee { private Address address; // constructor public Employee( Address newAddress ) { this.address = newAddress; } public Address getAddress() { return this.address; } public void setAddress(

依赖性

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();
  }
}
组合是聚合的一种特殊情况。以更具体的方式 以这种方式,受限聚合称为组合。当一个物体 包含另一个对象(如果包含的对象不存在) 如果容器对象不存在,则调用它 组成

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();
  }
}
简言之:

多亏了
Marko Topolnik
的帮助

  • 依赖关系
    发生在一个对象“依赖”另一个对象时。这两个对象之间可以有关系也可以没有关系。实际上,一个对象甚至可能不知道另一个对象存在,但它们可能是依赖的。 例如:生产者-消费者问题。生产者不需要知道消费者存在,但它必须执行wait()和notify()。所以,“不”,依赖性不是关联的子集

  • Composition
    :是一种关联类型,其中“子”对象在没有父类的情况下无法存在。i、 例如,如果子对象存在,那么它必须位于父对象中,而不是其他任何位置

    汽车(父母)有燃油喷射系统(孩子)。现在,在车外安装燃油喷射系统是没有意义的(这将是没有用的)。i、 燃油喷射系统离不开汽车

  • 聚合
    :在这里,子对象可以存在于父对象之外。 汽车有司机。司机可以存在于车外


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

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

    • 组合:在这里,您可以看到一个新的
      引擎
      车内创建。
      引擎
      对象是
      汽车
      的一部分。这意味着
      汽车
      发动机
      组成


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

    您为Dependency给出的示例不是一个Dependency,因为Employee类包含一个地址实例,这称为聚合。聚合类似于合成,只是对象也可以存在于使用它的类之外。(它可以位于classes范围之外)。 在您的示例中,您将地址的副本传递给员工构造函数。但是,由于它是在Employee对象之外创建的,因此该地址也可能存在于程序中的其他位置


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

    这很有趣。这里面有什么问题吗?也许是在标题里,那些定义的质量很差。例如:“…这两个类之间的依赖关系”“它不一定是相同的,反之亦然”,但“between”是一种无向关系——从术语between的定义来看,它是相同的,反之亦然。你能给我一个代码示例吗:)@MarkoTopolnik一个依赖性和组合的示例,我可以清楚地理解其中的差异。在代码中,如果可能的话,你是说一个组合是一个依赖项的子集吗?是的。。。依赖性是一个通用术语。。组合/聚合/继承导致依赖性。虽然我认为关联是一个比依赖更好的术语。你能告诉我这个词的来源吗?因为我得到的两个答案互相矛盾。此外,它们在UML中的表现也不同,例如,在类图中应该使用哪一种?如果依赖关系的定义是“结构/行为的变化影响类”,那么类之间就不应该有聚合或任何其他类型的关系。例如,他们可能都访问相同的第三个对象,并且必须就使用该对象的方式达成一致。典型的例子:生产者/消费者模式。从上面的评论中引用我自己的话:典型的例子:生产者/消费者模式。生产者和消费者都聚合一个队列对象,但在其他方面完全解耦,彼此不了解。然而,改变生产者的行为将影响(并可能破坏)消费者的行为。那么依赖性==聚合@dani-h否,
    聚合
    组合
    描述了事物是如何构建/构造的,而
    依赖性
    更像是某种结构的属性。请看@TheLostMind的伟大答案。