Übungsaufgaben zu Klassenbeziehungen: Assoziation, Aggregation, Komposition und Multiplizitäten

https://bildung.social/@oerinformatik/

https://oer-informatik.de/uml-klassendiagramm-assoziation-uebungsaufgaben

UML-Klassendiagramm, Assoziation, Aggregation, Komposition, Multiplizität, Rollennamen, Objektdiagramm, Beobachter, Übungsaufgaben, Prüfungsvorbereitung

tl/dr; (Bearbeitungszeit insgesamt 84 min, mehrere Aufgaben): Drei Übungsaufgaben zu Beziehungen im UML-Klassendiagramm: ein Klassenmodell mit Multiplizitäten und Rollen aus einer Planungsnotiz erstellen, Aggregation und Komposition an Diagramm, Quelltext und Objektdiagramm untersuchen sowie aus einem Java-Prototyp ein Klassendiagramm ableiten, seinen Ablauf vorhersagen und einen fehlerhaften Entwurf korrigieren. Alle Lösungen sind ausgeblendet und mit Punkteverteilung versehen [AI-Assisted]. (Zuletzt geändert am 29.10.2026)

Dieser Artikel ist Teil einer Artikelreihe über UML-Klassendiagramme: Einstieg in das Klassendiagramm (Übung Ticketautomat, Übungsaufgaben) / Sichtbarkeitsmodifikatoren / Assoziation, Aggregation, Komposition (Übungsaufgaben) / Vererbung (Übungsaufgaben) / Abstrakte Klassen und Interfaces / Polymorphie (Übungsaufgaben). Dazu: Klassendiagramme mit PlantUML zeichnen und Objektdiagramm.

Diese Übungsaufgaben gehören zum Artikel UML-Objektbeziehungen: Assoziation, Aggregation, Komposition aus der Infotext-Serie zu UML-Klassendiagrammen. Sie setzen die Grundlagen des UML-Klassendiagramms voraus und greifen am Rand Vererbung, Interfaces und Objektdiagramme auf.

Wortwolke mit den zentralen Begriffen der Übung: Assoziation, Aggregation, Komposition, Multiplizität, Klassendiagramm, Rollennamen und Lebensdauer (mit KI erstellt)

Hinweise zur Bearbeitung: Als FIA musst Du zur Teil-2-Prüfung Aufgaben auf Kernkompetenz-Ebene lösen können, das sind Aufgabe 2.1, Aufgabe 2.2 und Aufgabe 2.3. Zeichne Deine Diagramme auf Papier oder mit einem Werkzeug Deiner Wahl, bevor Du die Beispiellösung aufklappst. Eine saubere Handskizze genügt: Klassenkästen, Linien mit den richtigen Enden (Raute, Dreieck, Pfeil, gestrichelt oder durchgezogen) und die Multiplizitäten an den richtigen Enden. Klassen- und Attributnamen dürfen von der Beispiellösung abweichen, wenn sie selbsterklärend sind; andere fachlich richtige Lösungen sind ebenfalls richtig. Pseudocode darf in jeder üblichen Schreibweise notiert werden.

Du möchtest eigene Aufgaben zum Üben von einem KI-Sprachmodell generieren lassen?

Kopiere den Text in ein KI-Sprachmodell Deiner Wahl und passe Kompetenzstufe, Anzahl, Bearbeitungszeit und Szenario bei Bedarf an. Wie die Aufgaben aufgebaut sind, beschreibt der Artikel Wie sind die Aufgaben aufgebaut?. Prüfe die Ergebnisse mit dem Lehrartikel: KI-Sprachmodelle machen Fehler.

Erstelle neue Übungsaufgaben zum Thema „Klassenbeziehungen: Assoziation,
Aggregation, Komposition und Multiplizitäten“.

Bauplan: Halte Dich an Aufbau, Kompetenzstufen, Operatoren,
Anforderungsbereiche, Punkte und Zeitschätzung, die im Artikel
https://oer-informatik.de/aufgaben-aufbau beschrieben sind.

Fachliche Grundlage:
- https://oer-informatik.de/uml-klassendiagramm-assoziation
- https://oer-informatik.de/uml-klassendiagramm
- https://oer-informatik.de/uml-klassendiagramm-vererbung
- https://oer-informatik.de/uml-klassendiagramm-interface-abstraktion
- https://oer-informatik.de/uml-objektdiagramm
- Stilbeispiel: https://oer-informatik.de/uml-klassendiagramm-assoziation-uebungsaufgaben

Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- UML-Klassendiagramm
- Assoziation
- Aggregation
- Komposition
- Multiplizität
- Rollennamen
- Objektdiagramm
- Beobachter

Kompetenzstufe: Kernkompetenz (alternativ: Basiskompetenz, Profilkompetenz, Expertise)
Anzahl: 1 Aufgabe mit Teilaufgaben
Bearbeitungszeit in Minuten ca.: <5 bis 30 min>
Szenario: eines der Szenarien aus dem Bauplan

Vorgehen:
1. Lies zuerst die verlinkten Artikel. Kannst Du keine Webseiten
   abrufen, sag mir das, statt zu raten.
2. Steht bei einer Angabe noch ein Platzhalter in <…>, frag mich
   zuerst danach. Richte Punkte und Zahl der Teilaufgaben nach der
   Bearbeitungszeit (ca. 0,9 min je Punkt).
3. Gib je Aufgabe Titel mit Kompetenzstufe, Ausgangssituation und
   Teilaufgaben mit Operator und Punktzahl aus, dazu die geschätzte
   Bearbeitungszeit.
4. Gib die Beispiellösungen mit Punkteverteilung erst aus, wenn ich
   danach frage.

Aufgabe 2.1: Sessionplanung für ein Barcamp (Kernkompetenz)

(ca. 29 min Bearbeitungszeit)

Du bist Auszubildende*r und arbeitest im Orga-Team des Barcamps „Lernen.Digital.Leben 2027“ am Ratz und Rübe Berufskolleg in Bielefeld mit. Bisher plant Dimitrios Papadopoulos die Sessions in einer Tabellenkalkulation. Für die neue Planungssoftware sollst Du das Klassenmodell entwerfen. Dimitrios gibt Dir seine Planungsnotiz:

Planungsnotiz Sessionplanung – D. Papadopoulos, 12.10.2026

- Eine Veranstaltung hat einen Titel, ein Datum und eine maximale
  Zahl an Teilnehmenden. Die Software soll auch für spätere
  Veranstaltungen genutzt werden.
- Jede Veranstaltung hat genau fünf Zeitslots (Nummer, Beginn, Ende).
  Slots werden mit der Veranstaltung angelegt und mit ihr gelöscht.
- Räume (Bezeichnung, Plätze, barrierefrei ja/nein) gehören dem
  Berufskolleg und werden in der Raumverwaltung gepflegt. Eine
  Veranstaltung nutzt mindestens einen Raum; ein Raum kann für
  beliebig viele Veranstaltungen genutzt werden oder für noch keine.
- Sessions (Titel, Beschreibung, maximale Platzzahl) werden für genau
  eine Veranstaltung eingereicht. Wird eine Veranstaltung gelöscht,
  verschwinden auch ihre Sessions.
- Eine eingereichte Session hat zunächst weder Slot noch Raum. Nach
  der Planung liegt sie in genau einem Slot und genau einem Raum.
  Weil wir acht Räume haben, laufen in einem Slot höchstens acht
  Sessions gleichzeitig.
- Eine Session wird von einer bis drei Personen gehalten. Personen
  (Vorname, Nachname, E-Mail) können beliebig viele Sessions halten.
- Personen buchen Sessions (je Slot höchstens eine). Eine Session
  kann auch noch ohne Buchung sein.
- Die Software berechnet die Zahl der freien Plätze einer Session.
- Nach dem Barcamp geben Teilnehmende anonym Feedback (Sterne von 1
  bis 5, Kommentar). Ein Feedback gehört zu genau einer Session und
  wird mit ihr gelöscht.
- Manche Themen gibt es in zwei Teilen: Eine Session kann höchstens
  eine Fortsetzung haben und höchstens eine andere Session fortsetzen.

a) Erstelle aus der Planungsnotiz ein UML-Klassendiagramm. Es soll alle Klassen mit ihren Attributen (Name und Datentyp) und der Methode zur Berechnung der freien Plätze enthalten. Zeichne alle Beziehungen mit der passenden Beziehungsart und den Multiplizitäten an beiden Enden ein. Wo zwei Klassen mehrfach miteinander in Beziehung stehen oder eine Klasse mit sich selbst, unterscheide die Beziehungen durch Rollennamen. Getter und Setter sind nicht anzugeben. (21 Punkte)

Beispiellösung: Klassendiagramm der Sessionplanung mit Veranstaltung, Slot, Raum, Session, Person und Feedback (mit KI erstellt)

Punkteverteilung (Vorschlag):

  • 6 Punkte: je Klasse 1 Punkt für Namen und passende Attribute mit Datentyp (bei Session einschließlich freiePlaetze(): Integer).

  • 13,5 Punkte: neun Beziehungen mit je 0,5 Punkten für die richtige Art und 1 Punkt für beide Multiplizitäten:

    Beziehungen der Beispiellösung
    Beziehung Art Multiplizitäten
    Veranstaltung – Slot Komposition (Raute an Veranstaltung) 1 – 5
    Veranstaltung – Raum Aggregation (Raute an Veranstaltung) 0..* – 1..*
    Veranstaltung – Session Komposition (Raute an Veranstaltung) 1 – 0..*
    Slot – Session Assoziation 0..1 – 0..8
    Raum – Session Assoziation 0..1 – 0..*
    Person – Session (halten) Assoziation 1..3 – 0..*
    Person – Session (buchen) Assoziation 0..* – 0..*
    Session – Feedback Komposition (Raute an Session) 1 – 0..*
    Session – Session (Fortsetzung) Assoziation (Selbstbeziehung) 0..1 – 0..1
  • 1,5 Punkte: Rollennamen für die beiden Assoziationen zwischen Person und Session (z. B. referierende/gehalteneSessions und teilnehmende/gebuchteSessions) sowie für die Selbstbeziehung (vorgaenger/fortsetzung).

Bewertungshinweise:

  • Zwischen Feedback und Person darf keine Beziehung bestehen, weil das Feedback anonym ist. Eine solche Linie kostet 0,5 Punkte.

  • Die Regel „je Slot höchstens eine Buchung“ lässt sich mit Multiplizitäten nicht ausdrücken. Wer sie als Einschränkung in geschweiften Klammern notiert (z. B. Notiz {höchstens eine gebuchte Session je Slot}), zeigt Sorgfalt; Punkte gibt es dafür nicht extra. Die Multiplizität 0..5 bei gebuchteSessions ist nur richtig, wenn Personen je Veranstaltung neu angelegt werden – die Notiz sagt aber, dass die Software für mehrere Veranstaltungen genutzt wird.

  • Wer Veranstaltung – Session als einfache Assoziation zeichnet, verliert 0,5 Punkte (Art), wenn die Multiplizitäten stimmen.

  • Attribute für die Beziehungen (z. B. -slots: Slot[5]) sind nicht nötig. Wer sie zusätzlich angibt, macht keinen Fehler.

b) Erläutere die Bedeutung der beiden Multiplizitäten 0..1 und 0..8 in der Beziehung zwischen Slot und Session. (3 Punkte)

  • 0..1 steht am Ende von Slot und wird aus Sicht einer Session gelesen: Eine Session ist keinem oder genau einem Slot zugeordnet. Null gilt für eine eingereichte, noch nicht eingeplante Session; nach der Planung liegt sie in genau einem Slot. (1,5 Punkte)

  • 0..8 steht am Ende von Session und wird aus Sicht eines Slots gelesen: In einem Slot finden mindestens keine und höchstens acht Sessions statt, weil es nur acht Räume gibt. (1,5 Punkte)

Eine Multiplizität steht immer an der Klasse, deren Anzahl sie angibt – also gegenüber der Klasse, aus deren Sicht man liest.

c) Begründe, warum die Beziehung zwischen Veranstaltung und Slot als Komposition, die Beziehung zwischen Veranstaltung und Raum dagegen als Aggregation modelliert wird. Argumentiere dabei mit der Lebensdauer von Slots und Räumen. (4 Punkte)

  • Komposition Veranstaltung – Slot (2 Punkte): Beide Fälle sind Teil-Ganzes-Beziehungen. Ein Slot ist aber existenzabhängig: Er wird mit der Veranstaltung angelegt und mit ihr gelöscht, seine Lebensdauer ist also an die Veranstaltung gebunden. Außerdem gehört jeder Slot zu genau einer Veranstaltung (Multiplizität 1 am Ganzen).

  • Aggregation Veranstaltung – Raum (2 Punkte): Räume gehören dem Berufskolleg und werden in der Raumverwaltung gepflegt. Sie existieren vor der Veranstaltung und weiter, wenn sie gelöscht wird, und sie können gleichzeitig zu mehreren Veranstaltungen gehören (Multiplizität 0..* am Ganzen). Eine Komposition ist deshalb nicht möglich.

d) Beschreibe, wozu die Rollennamen an den beiden Assoziationen zwischen Person und Session dienen und warum sie hier nötig sind. (2 Punkte)

Ein Rollenname beschreibt, welche Rolle die Objekte am jeweiligen Ende einer Assoziation spielen (z. B. Personen als referierende einer Session). Weil zwischen Person und Session zwei Beziehungen mit unterschiedlicher Bedeutung und unterschiedlichen Multiplizitäten bestehen (halten und buchen), lassen sich die Linien ohne Rollennamen nicht unterscheiden. In der Programmierung werden die Rollennamen meist zu den Namen der Referenzattribute (z. B. referierende, gebuchteSessions). (je 1 Punkt)

e) Am Planungstag sind in Slot 3 sieben Sessions eingeplant. Erläutere an diesem Beispiel den Unterschied zwischen den Begriffen Multiplizität und Kardinalität. (2 Punkte)

Die Multiplizität 0..8 legt im Klassendiagramm fest, welche Anzahlen zulässig sind (die Menge aller erlaubten Werte 0 bis 8). Die Kardinalität ist in der UML die tatsächliche Anzahl der Verbindungen eines bestimmten Objekts: Für Slot 3 beträgt sie 7. (je 1 Punkt)

Hinweis: In der Datenbankmodellierung und in vielen Aufgaben wird „Kardinalität“ gleichbedeutend mit Multiplizität verwendet. Ist dort nach Kardinalitäten im Klassendiagramm gefragt, sind die Multiplizitäten gemeint.

Aufgabe 2.2: Bestellungen und Schließanlagen im Fahrradshop (Kernkompetenz)

(ca. 28 min Bearbeitungszeit)

Du bist Auszubildende*r im Entwicklungsteam der CSB-Rad GmbH in Bielefeld. Im Onlineshop können Kund*innen Räder konfigurieren (Rahmenform, RAL-Farbe) und gleichschließende Schlösser bestellen, die Lipper SchließTec in Lemgo fertigt. Alle Schlösser einer Schließanlage lassen sich mit demselben Schlüssel öffnen; Schlösser können später nachbestellt und einer bestehenden Schließanlage hinzugefügt werden. Es gibt auch Einzelschlösser ohne Schließanlage. Cem Sarıkaya hat für die Bestelllogik den folgenden Auszug aus dem Klassendiagramm entworfen:

Auszug aus dem Klassendiagramm des Onlineshops mit Kunde, Bestellung, Bestellposition, Artikel, Konfiguration, Schliessanlage und Schloss (mit KI erstellt)

a) Bastian Ludwig aus der Werkstatt hat den Entwurf gegengelesen und vier Anmerkungen notiert. Beurteile jede Anmerkung: Ist sie fachlich zutreffend? Begründe Deine Einschätzung jeweils mit der Notation im Diagramm. (8 Punkte)

Anmerkungen zum Entwurf der Bestelllogik
Nr. Anmerkung von Bastian Ludwig zutreffend? Begründung
1 „Die hohle Raute an Schliessanlage bedeutet: Löschen wir eine Schließanlage, sind auch alle ihre Schlösser weg.“
2 „Am Schloss steht 1..*. Ein Schloss kann also zu mehreren Schließanlagen gehören.“
3 „Von einem Artikel-Objekt aus kann das Programm nicht herausfinden, in welchen Bestellpositionen der Artikel vorkommt.“
4 „Die Konfiguration verweist auf eine Schließanlage. Deshalb sollte sie mit der Bestellposition nur über eine einfache Assoziation verbunden sein, nicht über eine Komposition.“
Beispiellösung zu den Anmerkungen
Nr. zutreffend? Begründung
1 nein Die hohle Raute kennzeichnet eine Aggregation: Schließanlage und Schlösser bilden ein Ganzes mit Teilen, die Schlösser existieren aber unabhängig von der Anlage weiter (etwa als Einzelschloss). Dass die Teile mit dem Ganzen verschwinden, gilt nur für die Komposition (gefüllte Raute).
2 nein Die Anmerkung liest die Multiplizität von der falschen Seite. 1..* steht am Ende von Schloss und gibt an, wie viele Schlösser zu einer Schließanlage gehören: mindestens eins. Wie viele Schließanlagen ein Schloss hat, steht am anderen Ende: 0..1, also keine oder genau eine.
3 ja Die offene Pfeilspitze zeigt nur in Richtung Artikel: Die Bestellposition kennt ihren Artikel, umgekehrt ist die Beziehung nicht navigierbar. Ein Artikel hält keine Referenzen auf Bestellpositionen.
4 nein Ob eine Konfiguration Teil der Bestellposition ist, hängt nicht von ihrer Verbindung zur Schließanlage ab. Eine Konfiguration (Rahmenform, Farbe, Aufpreis) wird für genau eine Position angelegt und ist ohne sie bedeutungslos; die Komposition bleibt richtig. Der Verweis auf die Schließanlage ist eine eigene, gerichtete Assoziation.

Je Anmerkung 1 Punkt für die richtige Einschätzung und 1 Punkt für eine Begründung, die die Notation (Raute, Multiplizität, Pfeilspitze) richtig deutet.

b) Cem Sarıkaya überlegt, Einzelschlösser aus dem Sortiment zu nehmen: Künftig soll jedes Schloss nur noch zusammen mit einer Schließanlage bestellt und angelegt werden, und wird eine Schließanlage aufgelöst, werden ihre Schlösser verschrottet und aus dem System entfernt. Gib an, welche Elemente der Beziehung zwischen Schliessanlage und Schloss im Diagramm Du dann ändern würdest, und begründe die Änderung. (3 Punkte)

  • Linienende: Aus der hohlen Raute wird eine gefüllte Raute an Schliessanlage (Komposition), weil die Schlösser dann existenzabhängig sind: Sie entstehen mit der Schließanlage und werden mit ihr entfernt. (1,5 Punkte)

  • Multiplizität am Ganzen: Aus 0..1 wird 1, denn ein Schloss ohne Schließanlage gibt es nicht mehr. Die Multiplizität 1..* am Ende von Schloss bleibt. (1 Punkt)

  • Folge für den Quelltext: Die Schließanlage erzeugt ihre Schlösser dann selbst (etwa mit einer Methode schlossAnlegen(art, seriennummer)), statt fertige Schloss-Objekte von außen zu übernehmen. (0,5 Punkte)

c) Ein Teil der Klassen ist bereits in Java umgesetzt:

public class Bestellung {
    private int bestellnummer;
    private ArrayList<Bestellposition> positionen = new ArrayList<>();

    public Bestellung(int bestellnummer) {
        this.bestellnummer = bestellnummer;
    }

    public void positionHinzufuegen(Artikel artikel, int menge) {
        positionen.add(new Bestellposition(artikel, menge, artikel.getNettoPreis()));
    }
}

public class Schliessanlage {
    private String schliessungscode;
    private ArrayList<Schloss> schloesser = new ArrayList<>();

    public Schliessanlage(String schliessungscode) {
        this.schliessungscode = schliessungscode;
    }

    public void hinzufuegen(Schloss schloss) {
        schloesser.add(schloss);
    }
}

In einem Test werden die Klassen so verwendet:

/* 1 */ Artikel lastenrad = katalog.suche("RAD-LR-03");
/* 2 */ Schloss buegel = new Schloss("Bügelschloss", "LS-26-00417");
/* 3 */ Schliessanlage anlage = new Schliessanlage("VS-7Q4K2M9");
/* 4 */ anlage.hinzufuegen(buegel);
/* 5 */ Bestellung bestellung = new Bestellung(1);
/* 6 */ bestellung.positionHinzufuegen(lastenrad, 1);
/* 7 */ anlage = null;
/* 8 */ bestellung = null;

ca) Erläutere anhand des Quelltextes, woran Du erkennst, dass Bestellung und Bestellposition als Komposition, Schliessanlage und Schloss dagegen als Aggregation umgesetzt sind. (3 Punkte)

  • Bestellung erzeugt ihre Bestellpositionen selbst (new Bestellposition(…) in positionHinzufuegen) und gibt keine Referenz darauf nach außen. Nur die Bestellung kennt ihre Positionen; sie leben und vergehen mit ihr → Komposition. (1,5 Punkte)

  • Schliessanlage bekommt ein Schloss, das außerhalb erzeugt wurde, als Parameter übergeben (hinzufuegen(Schloss schloss)). Andere Programmteile behalten eine Referenz auf dasselbe Objekt (buegel), das Schloss kann also unabhängig von der Schließanlage weiterleben → Aggregation. (1,5 Punkte)

cb) Erläutere, welche Objekte nach Zeile 8 noch erreichbar sind und welche der Garbage Collector entfernen darf. Berücksichtige, wie lange die Teile leben. (3 Punkte)

  • Entfernt werden dürfen: das Schliessanlage-Objekt (nach Zeile 7 zeigt keine Referenz mehr darauf), das Bestellung-Objekt und mit ihm das intern erzeugte Bestellposition-Objekt, denn nur die Bestellung hat darauf verwiesen. Die Lebensdauer des Teils endet mit dem Ganzen (Komposition). (1,5 Punkte)

  • Weiter erreichbar sind: das Schloss-Objekt über die Variable buegel – es überlebt das Ende der Schließanlage (Aggregation) – und der Artikel über lastenrad und den Katalog. Dass die Bestellposition den Artikel referenziert hat, ändert daran nichts. (1,5 Punkte)

Hinweis: In Java wird kein Objekt ausdrücklich gelöscht; ein Objekt „stirbt“, sobald es nicht mehr erreichbar ist. In Sprachen wie C++ müsste das Ganze seine Teile im Destruktor selbst freigeben.

d) Für eine Schulung der neuen Kolleg*innen soll eine Übersicht entstehen. Fülle die Tabelle aus: Ordne jeder Aussage die Beziehungsart zu und beschreibe kurz, wie sie im Klassendiagramm notiert wird. (6 Punkte)

Aussagen zu Beziehungen zwischen Klassen
Nr. Aussage Beziehungsart Notation
1 Die Kasse bekommt beim Bezahlen einen Gutschein als Parameter, prüft ihn und kennt ihn danach nicht mehr.
2 Ein Lastenrad ist ein Fahrrad und übernimmt alle Attribute und Methoden.
3 Die Klasse ZugferdRechnung stellt alle Methoden bereit, die ERechnung vorschreibt, ohne selbst etwas zu erben.
4 Jede Händlerkundschaft wird von genau einer Person aus dem Außendienst betreut.
5 Ein Lieferschein besteht aus Lieferpositionen, die ohne den Lieferschein nicht existieren.
6 Ein Lager verwaltet Fahrräder; verkaufte Räder verlassen das Lager und existieren weiter.
Beispiellösung zur Zuordnung
Nr. Beziehungsart Notation
1 Abhängigkeit (<<use>>) gestrichelte Linie mit offener Pfeilspitze von Kasse zu Gutschein
2 Generalisierung (Vererbung) durchgezogene Linie mit hohlem Dreieck an Fahrrad
3 Realisierung (Interface-Implementierung) gestrichelte Linie mit hohlem Dreieck an ERechnung (<<interface>>)
4 Assoziation durchgezogene Linie, Multiplizität 1 am Außendienst, 0..* an der Händlerkundschaft
5 Komposition durchgezogene Linie mit gefüllter Raute an Lieferschein
6 Aggregation durchgezogene Linie mit hohler Raute an Lager

Je Zeile 0,5 Punkte für die Beziehungsart und 0,5 Punkte für die Notation.

e) In einem Unit-Test findest Du die folgenden Testdaten als Objektdiagramm. Prüfe die Objekte und Verbindungen gegen das Klassendiagramm und nenne alle vier Stellen, an denen eine Multiplizität verletzt wird. (4 Punkte)

Objektdiagramm mit Testdaten: Kunde, zwei Bestellungen, Bestellpositionen, Artikel, Konfiguration, Schließanlagen und Schlösser (mit KI erstellt)
  1. b2 hat keine Bestellposition, laut Klassendiagramm braucht jede Bestellung mindestens eine (1..*).

  2. c1 ist mit p1 und p2 verbunden; als Teil einer Komposition gehört eine Konfiguration zu genau einer Bestellposition (1).

  3. p2 ist mit zwei Artikeln (a1, a2) verbunden, erlaubt ist genau ein Artikel (1).

  4. s2 gehört zu den Schließanlagen sa1 und sa2, erlaubt ist höchstens eine (0..1).

Je richtig benanntem Verstoß 1 Punkt. Die Kardinalitäten (tatsächliche Anzahlen der Links) liegen an diesen Stellen außerhalb der Multiplizität. Alle übrigen Verbindungen sind zulässig, z. B. hat sa2 mit einem Schloss die Untergrenze von 1..* gerade erreicht.

f) Die Methode gesamtNetto() der Klasse Bestellung soll den Nettowert der Bestellung liefern. Je Position zählt (Einzelpreis + Aufpreis der Konfiguration, falls vorhanden) mal Menge. Damit die Bestellung nicht auf die Konfigurationen ihrer Positionen zugreifen muss, ergänzt Du in Bestellposition die Methode positionswertNetto(). Implementiere beide Methoden in Pseudocode; die Methodenköpfe kannst Du in vier Notationen anzeigen (beschrieben im Artikel Algorithmen mit Pseudocode dokumentieren). (4 Punkte)

Funktion positionswertNetto(): double
Funktion gesamtNetto(): double

// in der Klasse Bestellposition
Funktion positionswertNetto(): double
    preis: double := einzelpreisNetto
    wenn konfiguration <> null dann
        preis := preis + konfiguration.aufpreisNetto
    Ende wenn
    Rückgabe preis * menge
Ende positionswertNetto

// in der Klasse Bestellung
Funktion gesamtNetto(): double
    summe: double := 0.0
    für jedes position in positionen
        summe := summe + position.positionswertNetto()
    Ende für
    Rückgabe summe
Ende gesamtNetto

Punkteverteilung: positionswertNetto 2 Punkte (Prüfung auf fehlende Konfiguration 1 Punkt, Berechnung und Rückgabe 1 Punkt); gesamtNetto 2 Punkte (Schleife über alle Positionen 1 Punkt, Aufsummieren und Rückgabe 1 Punkt).

Die Aufteilung folgt den Beziehungen: Jedes Ganze fragt nur seine direkten Teile. Wer konfiguration über einen Getter aus der Position herausholt, bekommt ebenfalls volle Punktzahl, wenn die Rechnung stimmt.

Aufgabe 2.3: Den Prototyp der Mitfahrbörse untersuchen (Kernkompetenz)

(ca. 27 min Bearbeitungszeit)

Du bist Auszubildende*r im FIA-Projektteam der Mitfahr-App „RatzFahrt“ des Ratz und Rübe Berufskollegs. Oksana Melnyk hat für die Anzeige auf den Flurmonitoren einen ersten Prototyp in Java geschrieben, aber kein Klassendiagramm dazu angelegt. Bevor das Team weiterarbeitet, sollst Du den Entwurf dokumentieren und prüfen.

Zum Prototyp gehören diese Festlegungen aus der Anforderungsbeschreibung:

  • Für jedes Schuljahr gibt es eine eigene Börse. Zum Ende des Schuljahres wird sie mit allen ihren Einträgen gelöscht.

  • Ein Eintrag ist immer ein Fahrtangebot oder ein Mitfahrgesuch.

  • Monitore und der Push-Dienst der App bestehen unabhängig von einer Börse. Beim Wechsel des Schuljahres können sie kurzzeitig bei der alten und der neuen Börse angemeldet sein.

  • Auf Wunsch der Datenschutzbeauftragten Andrea Wolf erhalten Anzeigeziele nur fertige, anonyme Texte und nie die Eintrags-Objekte selbst.

import java.util.ArrayList;
import java.util.List;

interface Anzeigeziel {
    void aktualisieren(List<String> texte);
}

abstract class Eintrag {
    private String haltepunkt;
    private String abfahrt;

    protected Eintrag(String haltepunkt, String abfahrt) {
        this.haltepunkt = haltepunkt;
        this.abfahrt = abfahrt;
    }

    protected String grunddaten() {
        return abfahrt + " " + haltepunkt;
    }

    public abstract String monitortext();
}

class Fahrtangebot extends Eintrag {
    private int freiePlaetze;

    public Fahrtangebot(String haltepunkt, String abfahrt, int freiePlaetze) {
        super(haltepunkt, abfahrt);
        this.freiePlaetze = freiePlaetze;
    }

    @Override
    public String monitortext() {
        return "Angebot " + grunddaten() + ", " + freiePlaetze + " Plätze frei";
    }
}

class Mitfahrgesuch extends Eintrag {
    private int anzahlPersonen;

    public Mitfahrgesuch(String haltepunkt, String abfahrt, int anzahlPersonen) {
        super(haltepunkt, abfahrt);
        this.anzahlPersonen = anzahlPersonen;
    }

    @Override
    public String monitortext() {
        return "Gesuch " + grunddaten() + ", " + anzahlPersonen + " Personen";
    }
}

class Angebotsboerse {
    private String schuljahr;
    private List<Eintrag> eintraege = new ArrayList<>();
    private List<Anzeigeziel> anzeigeziele = new ArrayList<>();

    public Angebotsboerse(String schuljahr) {
        this.schuljahr = schuljahr;
    }

    public void anmelden(Anzeigeziel ziel) {
        anzeigeziele.add(ziel);
    }

    public void abmelden(Anzeigeziel ziel) {
        anzeigeziele.remove(ziel);
    }

    public void fahrtAnbieten(String haltepunkt, String abfahrt, int freiePlaetze) {
        eintraege.add(new Fahrtangebot(haltepunkt, abfahrt, freiePlaetze));
        benachrichtigen();
    }

    public void mitfahrtSuchen(String haltepunkt, String abfahrt, int anzahlPersonen) {
        eintraege.add(new Mitfahrgesuch(haltepunkt, abfahrt, anzahlPersonen));
        benachrichtigen();
    }

    private void benachrichtigen() {
        List<String> texte = new ArrayList<>();
        for (Eintrag eintrag : eintraege) {
            texte.add(eintrag.monitortext());
        }
        for (Anzeigeziel ziel : anzeigeziele) {
            ziel.aktualisieren(texte);
        }
    }
}

class Flurmonitor implements Anzeigeziel {
    private String standort;

    public Flurmonitor(String standort) {
        this.standort = standort;
    }

    @Override
    public void aktualisieren(List<String> texte) {
        System.out.println(standort + " | Einträge: " + texte.size());
    }
}

class PushDienst implements Anzeigeziel {
    private String kanal;

    public PushDienst(String kanal) {
        this.kanal = kanal;
    }

    @Override
    public void aktualisieren(List<String> texte) {
        System.out.println(kanal + " | neu: " + texte.get(texte.size() - 1));
    }
}

public class Prototyp {
    public static void main(String[] args) {
        Angebotsboerse boerse = new Angebotsboerse("2026/27");
        Flurmonitor foyer = new Flurmonitor("Foyer");
        Flurmonitor parkplatz = new Flurmonitor("Parkplatz");
        PushDienst push = new PushDienst("App");

        boerse.anmelden(foyer);
        boerse.anmelden(push);
        boerse.fahrtAnbieten("Busbahnhof Bad Salzuflen", "07:05", 3);
        boerse.anmelden(parkplatz);
        boerse.abmelden(push);
        boerse.mitfahrtSuchen("Marktplatz Halle", "07:15", 2);
    }
}

a) Erstelle aus dem Quelltext (ohne die Klasse Prototyp) ein UML-Klassendiagramm mit allen Klassen, dem Interface, ihren Attributen und Methoden. Zeichne alle Beziehungen mit der passenden Beziehungsart ein und gib bei Kompositionen und Aggregationen die Multiplizitäten an beiden Enden an; nutze dafür auch die Festlegungen aus der Anforderungsbeschreibung. (9 Punkte)

Beispiellösung: Klassendiagramm der Angebotsbörse mit Komposition zu Eintrag, Aggregation zum Interface Anzeigeziel, zwei Generalisierungen und zwei Realisierungen (mit KI erstellt)
  • Klassen mit Attributen und Methoden, Eintrag abstrakt (kursiv bzw. {abstract}) mit abstrakter Methode monitortext(), Anzeigeziel als <<interface>>: 3 Punkte

  • Komposition Angebotsboerse (gefüllte Raute) – Eintrag mit 1 und 0..*: Die Börse erzeugt ihre Einträge selbst mit new und gibt sie nicht heraus, sie werden mit ihr gelöscht. 2 Punkte

  • Aggregation Angebotsboerse (hohle Raute) – Anzeigeziel mit 0..* und 0..*: Die Ziele werden außerhalb erzeugt und über anmelden(…) übergeben, bestehen unabhängig und können bei zwei Börsen gleichzeitig angemeldet sein (0..2 am Ganzen ist ebenfalls richtig). 2 Punkte

  • Generalisierung Fahrtangebot und Mitfahrgesuch → Eintrag (durchgezogen, hohles Dreieck) und Realisierung Flurmonitor und PushDienst → Anzeigeziel (gestrichelt, hohles Dreieck): 2 Punkte

Wer an den beiden Beziehungen der Börse zusätzlich eine Pfeilspitze zu Eintrag bzw. Anzeigeziel einzeichnet, liegt ebenfalls richtig: Im Quelltext kennt nur die Börse die anderen Objekte. Die Sichtbarkeit # von grunddaten() und der Konstruktor müssen nicht angegeben werden.

b) Gib die Ausgabe an, die das Programm beim Start von main auf der Konsole erzeugt, und erläutere, woher die Börse beim Aufruf von ziel.aktualisieren(texte) weiß, welche Methode ausgeführt wird. (5 Punkte)

Foyer | Einträge: 1
App | neu: Angebot 07:05 Busbahnhof Bad Salzuflen, 3 Plätze frei
Foyer | Einträge: 2
Parkplatz | Einträge: 2

Beim Angebot sind der Foyer-Monitor und der Push-Dienst angemeldet (in dieser Reihenfolge). Vor dem Gesuch kommt der Parkplatz-Monitor hinzu, der Push-Dienst meldet sich ab; beide Monitore erhalten jetzt die Liste mit zwei Texten. (3 Punkte, je Zeile 0,75 Punkte)

Die Börse kennt nur das Interface Anzeigeziel. Welche Implementierung von aktualisieren(…) läuft, entscheidet sich erst zur Laufzeit am tatsächlichen Objekt in der Liste (Flurmonitor oder PushDienst), also durch Polymorphie bzw. späte Bindung. Ebenso wählt eintrag.monitortext() die Methode des jeweiligen Fahrtangebots bzw. Mitfahrgesuchs. (2 Punkte)

c) Die Schülervertretung möchte, dass neue Einträge zusätzlich an einen E-Mail-Verteiler gehen. Beschreibe, welche Klasse Du dafür neu anlegst und in welcher Beziehung sie zu den vorhandenen Klassen steht. Begründe am Klassendiagramm, warum die Klasse Angebotsboerse dafür nicht geändert werden muss. (4 Punkte)

  • Neu ist eine Klasse wie EMailVerteiler (Attribut z. B. adresse), die das Interface Anzeigeziel realisiert (gestrichelte Linie mit hohlem Dreieck) und aktualisieren(texte) implementiert. Ein Objekt davon wird mit anmelden(…) bei der Börse angemeldet. (2 Punkte)

  • Die Börse hat ihre Aggregation nur zum Interface Anzeigeziel, nicht zu einer konkreten Klasse. Jedes Objekt, das das Interface realisiert, kann in ihrer Liste stehen und wird beim Benachrichtigen gleich behandelt. Die Börse ist also nur lose an die Anzeigeziele gekoppelt; neue Ziele lassen sich ergänzen, ohne dass sich an ihr etwas ändert. (2 Punkte)

d) Ein Teammitglied schlägt vor, die Methode im Interface auf aktualisieren(eintraege: List<Eintrag>) umzustellen, „dann kann jeder Monitor selbst entscheiden, was er anzeigt“. Bewerte den Vorschlag unter zwei Gesichtspunkten: Datenschutz und Kopplung der Klassen. (3 Punkte)

  • Datenschutz: Die Anzeigeziele bekämen die Eintrags-Objekte selbst und damit Zugriff auf alles, was ein Eintrag enthält oder später enthalten wird. Das widerspricht der Festlegung, dass nur fertige, anonyme Texte weitergegeben werden (Datenminimierung). (1,5 Punkte)

  • Kopplung: Jedes Anzeigeziel hinge dann zusätzlich von Eintrag und seinen Unterklassen ab. Ändert sich die Eintrags-Hierarchie, müssten alle Monitore, der Push-Dienst und künftige Ziele angepasst werden. Mit Texten kennt ein Anzeigeziel nur String. (1,5 Punkte)

Fazit: Der Vorschlag ist abzulehnen. Ein begründetes Urteil mit beiden Gesichtspunkten erhält volle Punktzahl.

e) Für die anonyme Monatsstatistik hat Jonas Wolff das folgende Klassendiagramm entworfen. Fachlich gilt: Eine Monatsstatistik besteht aus mindestens einem Monatswert, der nur innerhalb dieser Statistik existiert. Jeder Monatswert bezieht sich auf genau einen Haltepunkt; ein Haltepunkt kann in vielen Monatswerten vorkommen und existiert unabhängig von der Statistik. CsvExport setzt das Interface Exportformat um. Das Diagramm enthält vier Fehler. Beschreibe jeden Fehler und korrigiere ihn. (8 Punkte)

Entwurf mit Fehlern: Klassendiagramm der Monatsstatistik mit Monatsstatistik, Monatswert, Haltepunkt, Exportformat und CsvExport (mit KI erstellt)
Fehler im Entwurf und ihre Korrektur
Nr. Fehler Korrektur
1 Die Raute der Komposition sitzt am Teil (Monatswert) statt am Ganzen. gefüllte Raute an Monatsstatistik
2 Die Multiplizitäten zwischen Monatsstatistik und Monatswert sind vertauscht: 1..* steht an der Statistik, 1 am Monatswert. 1 an Monatsstatistik, 1..* an Monatswert
3 Haltepunkt – Monatswert ist als Komposition gezeichnet. Ein Monatswert wäre dann Teil zweier Ganzer, und der Haltepunkt ist kein Ganzes, dessen Löschen die Werte vernichten soll. Zusätzlich sind die Multiplizitäten vertauscht. einfache Assoziation mit 1 an Haltepunkt und 0..* an Monatswert
4 CsvExport erbt mit einer durchgezogenen Linie (Generalisierung) vom Interface. Realisierung: gestrichelte Linie mit hohlem Dreieck an Exportformat

Je Fehler 1 Punkt für die Beschreibung und 1 Punkt für die Korrektur. Die Abhängigkeit <<use>> von Monatsstatistik zu Exportformat ist richtig: Die Statistik bekommt das Format nur als Parameter von exportieren(…).

Korrigiertes Klassendiagramm der Monatsstatistik (mit KI erstellt)

Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zu Klassenbeziehungen: Assoziation, Aggregation, Komposition und Multiplizitäten” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/uml-klassendiagramm-assoziation-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/uml/uml-diagramme. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 29.10.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: