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

  1. Gefüllte Raute = Starke Bindung = Teil stirbt mit Ganzem
  2. Test für Komposition: "Kann Teil ohne Ganzes sinnvoll existieren?" → Nein = Komposition
  3. Eselsbrücke: "Gefüllte Raute = Vollständig abhängig"
  4. Code-Hinweis: Bei Komposition wird Teil meist im Konstruktor mit new erstellt
  5. Typischer Fehler: Komposition mit Aggregation verwechseln

Verwandte Konzepte