来自课件上的Java代码
public class WebServer {
private HttpListener listener;
private RequestProcessor processor;
public WebServer(HttpListener listener, RequestProcessor processor) {
this.listener = listener;
this.processor = processor;
}
}//Composition
public class WebServer {
private HttpListener listener;
private RequestProcessor processor;
public WebServer() {
this.listener = new HttpListener(80);
this.processor = new RequestProcessor(“/www/root”);
}
}//Aggregation
在这两个代码中,WebServer都包含了HttpListener和RequestProcessor这两个对象,但是它们之间的关系不同。
第一个代码中,WebServer类通过构造函数注入HttpListener和RequestProcessor,即WebServer包含了HttpListener和RequestProcessor,但是它们之间的生命周期并没有关联。这种关系称为组合(composition)。组合表示整体对象和部分对象之间的紧密关系,每个部分对象只能属于唯一的整体对象,不能被其他的整体对象所共享或引用。在这里,如果我们销毁WebServer对象,HttpListener和RequestProcessor对象也会被一起销毁。
第二个代码中,WebServer类自己实例化了HttpListener和RequestProcessor,WebServer包含了HttpListener和RequestProcessor,但是它们之间并没有紧密的关系。这种关系称为聚合(aggregation)。聚合表示整体对象和部分对象之间的松散关系,每个部分对象可以属于多个整体对象,可以被共享或引用。在这里,如果我们销毁WebServer对象,HttpListener和RequestProcessor对象并不会被一起销毁。
因此,第一个代码片段展示了组合的示例,而第二个代码片段展示了聚合的示例。