Was ist ein Kompositum?
In Komposita sind Objekte organisiert, die Einzelobjekte oder Mengen von Einzelobjekten enthalten können, wobei beide gleich behandelt werden. Ein Beispiel sind Baumstrukturen, etwa von hierarchischen Dateisystemdarstellungen, in denen einzelne Dateien und Verzeichnisse in übergeordneten Verzeichnissen organisiert sind.
import java.util.ArrayList;
import java.util.List;
interface Verpackung {
void enthalte();
}
class Kasten implements Verpackung {
private List<Verpackung> verpackungen = new ArrayList<Verpackung>();
@Override
public void enthalte() {
System.out.println("Kasten");
for (Verpackung v : verpackungen) {
v.enthalte();
}
}
public void legeRein(Verpackung v) {
verpackungen.add(v);
}
public void nimmRaus(Verpackung v) {
verpackungen.remove(v);
}
}
class Schachtel implements Verpackung {
@Override
public void enthalte() {
System.out.println("Schachtel");
}
}
class Dose implements Verpackung {
@Override
public void enthalte() {
System.out.println("Dose");
}
}
public class Kompositum {
public static void main(String[] args) {
schauRein();
}
public static void schauRein() {
Schachtel schachtel1 = new Schachtel(), schachtel2 = new Schachtel(),
schachtel3 = new Schachtel(), schachtel4 = new Schachtel();
Dose dose1 = new Dose(), dose2 = new Dose(), dose3 = new Dose();
Kasten kasten1 = new Kasten(), kasten2 = new Kasten();
kasten1.legeRein(schachtel1);
kasten1.legeRein(schachtel2);
kasten2.legeRein(schachtel3);
kasten2.legeRein(schachtel4);
kasten2.legeRein(dose1);
kasten2.legeRein(dose2);
kasten2.legeRein(dose3);
Kasten truhe = new Kasten();
truhe.legeRein(kasten1);
truhe.legeRein(kasten2);
truhe.enthalte();
}
}
Im Beispiel sind ein Interface und vier Klassen
deklariert. Neben der die main()
-Methode
enthaltenden Startklasse Kompositum
existieren zwei prinzipiell gleich aufgebaute Klassen Schachtel
und Dose
, die die prinzipielle
Erweiterbarkeit des Musters zeigen. Des Weiteren
existiert eine Klasse Kasten
. Alle drei
implementieren das Interface Verpackung
und
konkretisieren die Methode enthalte()
. Kasten
jedoch ist in der Lage, beliebige Objekte eines Typs,
der Verpackung
implementiert, in einer
Liste zu speichern und deren Methoden enthalte()
aufzurufen. Dies geschieht dadurch, dass die in der
Liste gespeicherten Objekte in einer Schleife aufgerufen
werden.
In main()
wird schauRein()
aufgerufen. Dort werden mehrere Objekte der das
Interface Verpackung
implementierenden
Klassen gebildet. Die Objekte der 'Einzelklassen' Dose
und Schachtel
werden anschließend in
den Listen der Kasten
-Objekte gespeichert.
Alle Elemente werden schließlich einem einzigen Kasten
-Objekt
hinzugefügt und dessen Methode enthalte()
aufgerufen. Als Ergebnis werden alle beteiligten enthalte()
-Methoden
aufgerufen, ohne dass von außen erkenntlich ist,
aus welcher Klasse sie stammen.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.