Dieses Wiki, das alte(!) Projektwiki (projektwiki.zum.de)
wird demnächst gelöscht.
Bitte sichere Deine Inhalte zeitnah,
wenn Du sie weiter verwenden möchtest.
Gerne kannst Du natürlich weiterarbeiten
im neuen Projektwiki (projekte.zum.de).Liste in perfekter Komposition
Inhaltsverzeichnis |
Entwurfsmuster Kompositum
Problematik
Die Zielsetzung ist die Trennung von Struktur und Inhalt. Dies wurde durch die Klasse KNOTEN bereits zum Teil erfüllt. Jedoch verhält sich der letzte Knoten in der Liste anders als die Restlichen, wegen der Überprüfung ob es einen Nachfolger gibt.
if(nachfolger != null)
{}
Lösung
Optimaler wäre es, wenn alle Objekte der Klasse KNOTEN sich gleich verhalten und die Abfrage nach dem Nachfolger nicht mehr nötig ist. Abhilfe schafft eine neue Klasse ABSCHLUSS, welche stets das letzte Objekt in der Liste darstellt und die Aufgaben des eigentlichen letzten Knotens übernimmt.
Dazu wird eine abstrakte Basisklasse LISTENELEMENT erstellt, von welcher die Klasse KNOTEN und ABSCHLUSS erben. In der Klasse ABSCHLUSS wird jediglich das ausformuliert, was der letzte Knoten machen müsste.
Objekte der Klasse ABSCHLUSS
Sekundäre Überschrift
Objektsituation vor und nach dem Aufruf der Methode EinfuegenVor
Vorher
Damit die Methode EinfuegenVor ausgeführt werden kann, müssen Objekte dieser Klassen bereits erzeugt sein:
- LISTE
- KNOTEN (mind. 2)
- ABSCHLUSS
- PATIENT bzw. DATENELEMENT (mind. 2)
Das Objektdiagramm sieht dementsprechend so aus: Siehe Bild ObjektdiagrammVorher
Wird die Methode EinfuegenVor(d_neu, d_vergleich) nun ausgeführt, wird nach d_neu und d_vergleich verlangt. Siehe Bild Methodenaufruf
d_neu ist das Datenelement, welches eingefügt werden soll.
d_vergleich ist das Datenelement, welches verglichen wird und dann der Nachfolger von d_neu wird.
d_neu kann entweder ein neu erzeugtes Datenelement oder ein bereits vorhandenes, aber noch nicht eingefügtes Datenelement, sein.
d_vergleich kann nur ein Datenelement sein, dass bereits in der Liste eingefügt ist.
Nachher
Ist die Methode fertig ausgeführt befindet sich das neue Datenelement vor dem verglichenen Datenelement.
- Alle Attributwerte (z.B. Nachfolger) von d_vergleich bleiben gleich
- d_vergleich ist nun der Nachfolger von d_neu
- Der frühere Vorgängerknoten von d_vergleich hat nun d_neu als Nachfolger
Objektdiagramm nach dem dem Aufruf: Siehe Bild ObjektdiagrammNachher