Ihr erstes Beispiel ist keine Zusammensetzung.
Composition ist eine „has-a“ Beziehung zwischen Objekten 2, wobei ein Objekt (das zusammengesetzte Objekt) ein Feldelement der anderen (der Besitzer).
Zusammensetzung wäre:
class DemoA {
DemoB b; //composition
}
Wir würden sagen, "DemoA von Demob zusammengesetzt ist".
Wenn das DemoB
Objekt noch verwendbar ist, wenn DemoA
nicht mehr erreichbar ist, betrachten wir DemoB
aggregated zu sein. Beispielsweise können Schlüssel weiterhin verwendet werden, obwohl der Schlüsselring möglicherweise zerstört wurde. Der Schlüsselring besteht aus Schlüsseln, besitzt diese aber nicht, was eine Aggregation ausdrückt.
Ihr Forwarding Beispiel sieht gut aus, obwohl die Anforderungen sagen „die Ergebnisse zurück“, was die Verfahren könnte darauf hindeuten, nicht leer sein sollte:
class DemoA {
private DemoB b;
public int doSomething() {
return b.doSomething(); //forwarding/delegating
}
}
Was Wrapper , kapseln sie das Verhalten des Objekts ein und zeigen neue (und normalerweise komplexere) Verhaltensweisen auf. Ein Beispiel wäre DataInputStream
, das eine umschließt, damit Sie String
Objekte und mehr lesen können, wenn nur zu primitiven Daten fähig ist.
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;
}
}
In diesem Beispiel DemoA
Wraps DemoB
das readUntil
Verhalten aufzudecken, etwas DemoB
zu tun unfähig war. Diese
ist etwas ein dummes Beispiel, drückt aber hoffentlich den Punkt: Unser DemoB
Objekt nicht Verhalten durchführen können, was wir brauchen (readUntil), so dass wir sie in einer Art wickeln, die das Verhalten für uns behandelt, so dass wir aren‘ t ein solches Verhalten ständig neu zu schreiben.