UML-Komposition
Komposition ist die stärkste Form einer "besteht-aus"-Beziehung, bei der das Teil-Objekt NICHT ohne das Ganze existieren kann.
In UML wird Komposition durch eine Linie mit einer gefüllten Raute (◆) dargestellt. Wird das Ganze gelöscht, werden auch alle Teile gelöscht.
Kernpunkte
Komposition ist eine starke "HAS-A"-Beziehung mit Existenzabhängigkeit:
- Darstellung: Gefüllte Raute (◆) + Linie
- Bedeutung: "besteht aus" (stärker als "hat")
- Teil kann NICHT ohne Ganzes existieren (stirbt mit Ganzem)
- Raute zeigt zur "Ganzes"-Klasse (Container)
- Beispiel: Haus besteht aus Zimmern (Zimmer stirbt mit Haus)
ASCII-Diagramm: UML-Komposition
KOMPOSITION (STARKE BESITZBEZIEHUNG)
┌────────────────┐ ┌────────────────┐
│ HAUS │◆──────────│ ZIMMER │
├────────────────┤ ├────────────────┤
│ - adresse │ │ - nummer: int │
│ - groesse: int │ │ - groesse: int │
└────────────────┘ └────────────────┘
◆ Gefüllte Raute
BEDEUTUNG:
→ Haus "besteht aus" Zimmern
→ Zimmer kann NICHT ohne Haus existieren
→ Wird Haus abgerissen, werden Zimmer auch zerstört
→ ◆ zeigt zur "Ganzes"-Klasse (Haus)
Komposition vs. Aggregation
HAUPTUNTERSCHIED
AGGREGATION (◇ hohle Raute)
┌────────────┐ ┌────────────┐
│UNIVERSITÄT │◇────────│ STUDENT │
└────────────┘ └────────────┘
→ Student kann Uni wechseln
→ Student existiert nach Uni-Schließung weiter
→ SCHWACHE Beziehung
KOMPOSITION (◆ gefüllte Raute)
┌────────────┐ ┌────────────┐
│ HAUS │◆────────│ ZIMMER │
└────────────┘ └────────────┘
→ Zimmer kann nicht Haus wechseln
→ Zimmer wird mit Haus zerstört
→ STARKE Beziehung mit Existenzabhängigkeit
Java-Code-Beispiel
// KOMPOSITION: Haus besteht aus Zimmern
public class Haus {
private String adresse;
private List<Zimmer> zimmer; // ← Komposition
public Haus(String adresse) {
this.adresse = adresse;
this.zimmer = new ArrayList<>();
// Zimmer werden MIT dem Haus erstellt
zimmer.add(new Zimmer(1, 20.5)); // ← new!
zimmer.add(new Zimmer(2, 15.0)); // ← new!
zimmer.add(new Zimmer(3, 25.0)); // ← new!
}
// Destruktor (in Java: finalize, aber besser: try-with-resources)
public void abreissen() {
System.out.println("Haus wird abgerissen.");
// Zimmer werden automatisch mit gelöscht (Garbage Collector)
zimmer.clear();
zimmer = null;
}
}
public class Zimmer {
private int nummer;
private double groesse;
public Zimmer(int nummer, double groesse) {
this.nummer = nummer;
this.groesse = groesse;
}
}
// VERWENDUNG
Haus haus = new Haus("Berliner Str. 10");
// Zimmer wurden INNERHALB des Hauses erstellt
haus.abreissen();
// Zimmer werden MIT dem Haus zerstört!
// Kein Zugriff mehr auf Zimmer möglich
Weitere Beispiele
TYPISCHE KOMPOSITIONEN
┌────────────────────────────────────────┐
│ AUTO ◆──> MOTOR │
│ → Motor ist fester Bestandteil │
│ → Auto ohne Motor = kaputt │
└────────────────────────────────────────┘
┌────────────────────────────────────────┐
│ DOKUMENT ◆──> SEITEN │
│ → Seiten gehören zum Dokument │
│ → Dokument löschen = Seiten löschen │
└────────────────────────────────────────┘
┌────────────────────────────────────────┐
│ BAUM ◆──> BLÄTTER │
│ → Blätter sind Teil des Baums │
│ → Baum fällen = Blätter sterben │
└────────────────────────────────────────┘
┌────────────────────────────────────────┐
│ FORMULAR ◆──> FELDER │
│ → Felder gehören zum Formular │
│ → Formular löschen = Felder löschen │
└────────────────────────────────────────┘
Wichtig für AP2
Komposition Merkmale:
- Notation: Gefüllte Raute (◆) + Linie
- Bedeutung: "besteht aus" / starke Besitzbeziehung
- Raute zeigt zum Ganzen (Container)
- Existenzabhängigkeit: Teil stirbt mit Ganzem!
Unterschiede:
- Komposition: ◆─── (gefüllte Raute) - Teil stirbt mit Ganzem
- Aggregation: ◇─── (hohle Raute) - Teil kann ohne Ganzes existieren
- Assoziation: ─── (einfache Linie) - nur Referenz
Typische Prüfungsfrage: "Wann verwendet man Komposition statt Aggregation?"
→ Antwort: Wenn Teil nicht ohne Ganzes existieren kann (Existenzabhängigkeit)!
Praxis-Beispiel
BEISPIEL: ONLINE-FORMULAR
┌─────────────────┐ ┌─────────────────┐
│ FORMULAR │◆────────│ FELD │
├─────────────────┤ 1 * ├─────────────────┤
│ - titel: String │ │ - label: String │
│ - id: int │ │ - typ: String │
└─────────────────┘ │ - wert: String │
└─────────────────┘
→ Formular "besteht aus" Feldern
→ Felder werden mit Formular erstellt
→ Formular löschen = Felder werden auch gelöscht
→ KOMPOSITION (◆)
CODE:
public class Formular {
private String titel;
private List<Feld> felder; // Komposition
public Formular(String titel) {
this.titel = titel;
this.felder = new ArrayList<>();
// Felder werden HIER erstellt (nicht von außen)
felder.add(new Feld("Name", "text"));
felder.add(new Feld("Email", "email"));
}
}
Praxis-Tipps für AP2
- Gefüllte Raute = Starke Bindung = Teil stirbt mit Ganzem
- Test für Komposition: "Kann Teil ohne Ganzes sinnvoll existieren?" → Nein = Komposition
- Eselsbrücke: "Gefüllte Raute = Vollständig abhängig"
- Code-Hinweis: Bei Komposition wird Teil meist im Konstruktor mit
newerstellt - Typischer Fehler: Komposition mit Aggregation verwechseln
Verwandte Konzepte
- UML-Aggregation - Schwache Besitzbeziehung
- UML-Assoziation - Einfache Beziehung
- Vererbung - IS-A Beziehung