2014-01-09 141 views
5

Definitions taken from here依赖和组成之间的区别?

依赖

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

组成

成分是聚合的一种特殊情况。在更具体的 方式中,受限制的聚合称为合成。当一个对象 包含另一个对象,如果包含的对象不能存在 没有容器对象的存在,那么它被称为 组成。从here在Java中

具体的例子和here

依赖

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

这很有趣。那里有什么问题吗? – Bathsheba

+1

也许这是标题 –

+0

这些定义的质量很差。例如:“......这两个类之间的依赖关系”“它不一定是相同的”但是“之间”是无向关系---反之亦然*根据术语**之间的定义***。 –

回答

11

的差异可以看出,在两个构造函数:

  • 依赖:本Address对象来自,它的分配在其他地方。这意味着AddressEmployee对象分开存在,并且只有依赖于彼此。

  • 组成:这里你可以看到一个新的Engine创建CarEngine对象是Car的一部分。这意味着Car组成的Engine

+1

所以依赖关系==聚合? http://stackoverflow.com/questions/11881552/implementation-difference-between-aggregation-and-composition-in-java/12431359#12431359 –

+0

@ dani -h不,聚合和组合描述如何构建/结构化,而“依赖性”更多是某个结构的属性。看@ TheLostMind的伟大答案。 –

5

简单地说:

感谢当一个对象 “依赖” 于另一个发生这个...

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

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

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

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

+0

因此,您是说组合是依赖项的子集? –

+0

是......依赖是一个通用术语。组合/聚合/继承导致依赖。尽管我认为联想是一个更好的术语,而不是依赖关系。 – TheLostMind

+0

你能告诉我这个的来源吗?因为我有两个答案互相抵触。而且,它们在UML中表现出不同,哪一种应该在类图中使用? –

0

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

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

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

相关问题