你的第一個例子不是組合。
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),所以我們把它包在處理的行爲對我們是一個類型的,所以我們不是活得不斷重寫這種行爲。