依赖
类的结构或行为的变化会影响其他相关的 class,那么这两个类之间存在依赖关系。它需要 反之亦然。当一个类包含其他类时 这发生了。
组合物
的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();
}
}
答案 0 :(得分:19)
可以在两个构造函数中看到差异:
依赖:Address
对象来自外部,它被分配到其他地方。这意味着Address
和Employee
对象分开存在,并且只有依赖。
撰写:您在此处看到在 Engine
内创建了新的Car
。 Engine
对象是Car
的一部分。这意味着Car
的<{1}} 组成。
答案 1 :(得分:7)
简单地说:
感谢Marko Topolnik
为此......
Dependency
。它可以在两个对象之间有或没有关系的情况下发生。实际上,一个对象可能甚至不知道另一个对象存在,但它们可能是依赖的。
示例:生产者 - 消费者问题。生产者不需要知道消费者存在,但它必须做wait()和notify()。因此,“NO”,依赖关系不是关联的子集。
Composition
:是一种关联类型,其中“子”对象在没有父类的情况下不能存在。即,如果子对象存在,那么它必须在父对象中,而不是其他地方。
EG:汽车(父母)有燃油喷射系统(儿童)。现在,在汽车外面安装燃油喷射系统是没有意义的(这是没用的)。也就是说,没有汽车就不能存在燃油喷射系统。
Aggregation
:这里,子对象可以存在于父对象之外。
一辆车有一个司机。司机CAN存在于车外。
答案 2 :(得分:0)
依赖性是指仅在函数范围内使用对象。换句话说,类的实例仅存在于包含类的函数(或方法)中,并在函数退出后被销毁。
您为Dependency 提供的示例不是依赖关系,因为Employee类包含Address的实例,这称为聚合。聚合就像一个Composition,除了对象也可以存在于使用它的类之外。 (它可以位于类范围之外)。 在您的示例中,您将一个Address的副本传递给Employee构造函数。但由于它是在Employee对象之外创建的,因此Address也可能存在于程序中的其他位置。
与Aggregation一样,Composition是组件对象可用于整个复合对象的位置。这意味着复合对象的所有方法/功能都可以访问组件对象。 Aggregation和Composition之间的唯一区别在于,在Composition中,组件对象仅存在于复合对象内,而在程序中没有其他位置。因此,当复合对象被销毁时,给定的组件对象也会被销毁,并且不能存在于其他任何地方。在您的示例中,Car是一个复合对象,Engine是一个组件,因为Engine的实例只存在于特定的Car中,而不存在于其他地方。