Ü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.
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)
Punkteverteilung (Vorschlag):
6 Punkte: je Klasse 1 Punkt für Namen und passende Attribute mit Datentyp (bei
SessioneinschließlichfreiePlaetze(): 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–5Veranstaltung – Raum Aggregation (Raute an Veranstaltung)0..*–1..*Veranstaltung – Session Komposition (Raute an Veranstaltung)1–0..*Slot – Session Assoziation 0..1–0..8Raum – 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..11,5 Punkte: Rollennamen für die beiden Assoziationen zwischen
PersonundSession(z. B.referierende/gehalteneSessionsundteilnehmende/gebuchteSessions) sowie für die Selbstbeziehung (vorgaenger/fortsetzung).
Bewertungshinweise:
Zwischen
FeedbackundPersondarf 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ät0..5beigebuchteSessionsist nur richtig, wenn Personen je Veranstaltung neu angelegt werden – die Notiz sagt aber, dass die Software für mehrere Veranstaltungen genutzt wird.Wer
Veranstaltung – Sessionals 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..1steht am Ende vonSlotund 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..8steht am Ende vonSessionund 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
1am 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:
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)
| 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.“ |
| 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..1wird1, denn ein Schloss ohne Schließanlage gibt es nicht mehr. Die Multiplizität1..*am Ende vonSchlossbleibt. (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)
Bestellungerzeugt ihre Bestellpositionen selbst (new Bestellposition(…)inpositionHinzufuegen) und gibt keine Referenz darauf nach außen. Nur die Bestellung kennt ihre Positionen; sie leben und vergehen mit ihr → Komposition. (1,5 Punkte)Schliessanlagebekommt 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), dasBestellung-Objekt und mit ihm das intern erzeugteBestellposition-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 Variablebuegel– es überlebt das Ende der Schließanlage (Aggregation) – und derArtikelüberlastenradund 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)
| 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. |
| 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)
b2hat keine Bestellposition, laut Klassendiagramm braucht jede Bestellung mindestens eine (1..*).c1ist mitp1undp2verbunden; als Teil einer Komposition gehört eine Konfiguration zu genau einer Bestellposition (1).p2ist mit zwei Artikeln (a1,a2) verbunden, erlaubt ist genau ein Artikel (1).s2gehört zu den Schließanlagensa1undsa2, 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)
Klassen mit Attributen und Methoden,
Eintragabstrakt (kursiv bzw.{abstract}) mit abstrakter Methodemonitortext(),Anzeigezielals<<interface>>: 3 PunkteKomposition
Angebotsboerse(gefüllte Raute) –Eintragmit1und0..*: Die Börse erzeugt ihre Einträge selbst mitnewund gibt sie nicht heraus, sie werden mit ihr gelöscht. 2 PunkteAggregation
Angebotsboerse(hohle Raute) –Anzeigezielmit0..*und0..*: Die Ziele werden außerhalb erzeugt und überanmelden(…)übergeben, bestehen unabhängig und können bei zwei Börsen gleichzeitig angemeldet sein (0..2am Ganzen ist ebenfalls richtig). 2 PunkteGeneralisierung
FahrtangebotundMitfahrgesuch→Eintrag(durchgezogen, hohles Dreieck) und RealisierungFlurmonitorundPushDienst→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 InterfaceAnzeigezielrealisiert (gestrichelte Linie mit hohlem Dreieck) undaktualisieren(texte)implementiert. Ein Objekt davon wird mitanmelden(…)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
Eintragund 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 nurString. (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)
| 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(…).
Links und weitere Informationen
UML-Objektbeziehungen: Assoziation, Aggregation, Komposition (zugehöriger Artikel)
Klassenbeziehungen: Vererbung und abstrakte Klassen und Interfaces
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]
