你的第一个例子不是组合。
Composition是2名对象,其中一个对象(所构成的对象)是其他的场构件(所有者)之间的“has-a”的关系。
组成是:
class DemoA {
DemoB b; //composition
}
我们会说: “DemoA由复员的”。
如果DemoB
对象仍然是可用的,当DemoA
变得无法访问,我们认为DemoB
是aggregated。例如,虽然密钥环可能已被破坏,但仍可使用密钥。密钥环由密钥组成,但不拥有它们,表示聚合。
你转发的例子看起来不错,但要求不要说“返回结果”,这可能意味着该方法不应该是无效的:
class DemoA {
private DemoB b;
public int doSomething() {
return b.doSomething(); //forwarding/delegating
}
}
至于包装,它们封装了对象的行为,暴露了新的(通常更复杂的)行为。一个例子是DataInputStream
,它包装InputStream
以允许您读取String
对象和更多,当InputStream
只有原始数据时。
class DemoB {
public int read() {
//...Read one int of data
}
}
class DemoA {
private DemoB b;
public DemoA(DemoB b) {
this.b = b;
}
public List<Integer> readUntil(List<Integer> dataList, Supplier<Boolean> condition) {
while(condition.get())
dataList.add(b.read());
return dataList;
}
}
在这个例子中,DemoA
包裹DemoB
揭露readUntil
行为,一些DemoB
无法执行的。
这有点傻例子,但希望表达一点:我们DemoB
对象不能执行的行为,我们需要(readUntil),所以我们把它包在处理的行为对我们是一个类型的,所以我们不是活得不断重写这种行为。