Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Grundlagen der Programmierung: Entwurfsmuster

Kompositum: Problem und Lösung

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Knoten und Blätter eines Baumes unterscheiden sich zwar in Eigenschaften und Fähigkeiten, doch das "Kompositum" ermöglicht, sie auf die selbe Weise anzusprechen.
04:42

Transkript

Das Kompositum ist ein Entwurfsmuster, das sich mit Baumstrukturen beschäftigt. Dabei geht es um folgende Situation. Die Objekte sind, wie gesagt, in einer Baumstruktur organisiert. Es gibt also Blätter und Knoten. Die Knoten sind die Verzweigungen des Baumes und die Blätter sind die jeweiligen Endpunkte. Ein Client sollte nun all diese Elemente auf die gleiche Weise behandeln können, ohne dabei wissen zu müssen, ob es im Einzelfall um ein Blatt oder einen Knoten handelt. Solche Strukturen kommen in den verschiedensten Bereichen vor. Eins der bekannteren Beispiele sind grafische Oberflächen. Ein Fenster kann weitere Elemente enthalten, die wiederum weitere Unterelemente enthalten können. Ein weiteres Beispiel sind Verzeichnisstrukturen. Dort gibt es Verzeichnisse, die können Dateien enthalten aber auch weitere Unterverzeichnisse. Auch hier ergibt sich also eine Baumstruktur. Auch hierarchisch geordnete Aufgabenlisten lassen sich hier einordnen. Sie kennen es wahrscheinlich. Auf einer solchen Liste stelle man sich die Aufgaben zusammen, die man gerne erledigen möchte. Einige diese Aufgaben sind aber selbst wieder Listen, denn sie bestehen aus mehreren Teilschritten. Einige dieser Teilschritte wiederum können nun ebenfalls aus Unterteilschritten bestehen, sodass wir auch hier wieder eine Baumstruktur haben. Ganz allgemein sieht eine solche Baumstruktur so aus. Wir haben oben einen Wurzelknoten und in der nächsten Ebene können wir dann sowohl Knoten als auch Blätter haben. Jeder Knoten hat wiederum weitere Unterelemente und das geht dann solange weiter, bis wir überall an einem Blatt angekommen sind. Ich habe die Knoten, die Blätter hier mit unterschiedlichen Farben versehen um deutlich zu machen, dass sie verschiedene Funktionalitäten haben, also auch Instanzen unterschiedlicher Klassen sind. Wenn ein Client nun auf die Elemente eines solchen Baumes zugreifen möchte, dann muss er bei jedem Element wissen, ob es ein Blatt oder ein Knoten ist, denn nur dann kann er die Funktionalität korrekt ansprechen. Übertragen wir das jetzt auf das Beispiel mit der Aufgabenliste. Die Blätter in einem solchen Baum sind EinzelAufgaben. Um es hier nicht unnötig kompliziert zu machen, habe ich diese Klasse auf das minimal Notwendige reduziert. In dieser Minimalversion hat die EinzelAufgabe zuerst Attribut beschreibung, indem ein kurzer Text drinnen steht, der die Aufgabe beschreibt. Die erste Methode wirdErledigt dient dazu die Aufgabe als erledigt zu markieren und mit der zweiten Methode istErledigt lässt sich dann entsprechend herausfinden, ob die Aufgabe bereits erledigt wurde oder noch nicht. Das sind also die Blätter. Kommen wir jetzt zu den Knoten. Die Knoten müssen Unterelemente enthalten können, deswegen heißt die Klasse AufgabenListe. Auch eine solche Liste hat natürlich erst mal eine kurze Beschreibung. Die Unterelemente einer solchen Liste können nun entweder EinzelAufgaben oder weitere AufgabenListe sein. Da das zwei verschiedene Klassen sind, brauchen wir dafür natürlich auch zwei verschiedene Datenstrukturen, um diese Elemente vorhalten zu können. Die Methode wirdErledigt funktioniert bei der AufgenListe etwas anders als bei der EinzelAufgabe. Wenn ich bei einer Liste sage wirdErledigt, dann bedeutet das, dass alle Elemente dieser Liste als erledigt markiert werden sollen und damit ist dann also auch die ganze Liste erledigt. Entsprechend muss die zweite Methode istErledigt also auch durch alle Unterelemente durchgehen und deren jeweiligen Status abfragen. Nur wenn alle Teilaufgaben abgeschlossen sind, dann ist natürlich die gesamte Liste abgeschlossen. Und schließlich brauchen wir natürlich noch eine Möglichkeit der Liste Elemente hinzuzufügen und auch hier brauchen wir wieder zwei Methoden, eine für das Hinzufügen von Einzelaufgaben und eine für das Hinzufügen von weiteren Listen. Ein Client, der mit einer solchen hierarchischen Aufgabenliste konfrontiert wird, sieht sich natürlich wieder demselben Problem gegenüber. Er muss bei jedem einzelnen Element, das er anspricht, wissen, ob es eine Liste ist oder eine Einzelaufgabe und das selbst bei Methoden, die eigentlich in beiden Klassen vorhanden sind, also in unserem Fall wirdErledigt und istErledigt. Wie sieht nun die Lösung für dieses Problem aus? Als ersten und wichtigsten Schritt ziehen wir die gemeinsame Funktionalität von Blättern und Knoten in eine gemeinsame abstrakte Basisklasse zusammen. Hier ist also das Attribut für die Beschreibung enthalten und es wird festgelegt, dass die Unterklassen die beiden Methoden wirdErledigt und istErledigt haben müssen. Im nächsten Schritt deklarieren wir die EinzelAufgabe als Unterklasse dieser abstrakten Basisklasse. In den beiden Methoden implementieren wir dann das Verhalten für diese EinzelAufgabe. Das heißt, im Wesentlichen lesen bzw. schreiben wir ein boolsches Attribut. Das ist also die Klasse für die Blätter unseres Baumes. Nun kommt die Klasse für die Knoten. Auch diese Klasse ist jetzt natürlich eine Unterklasse von Aufgabe und muss deshalb natürlich auch die beiden Methoden implementieren. Außerdem gibt es hier natürlich eine weitere Methode, mit der wir der Liste weitere Elemente hinzufügen können und diese Methode fügt die Elemente dann einer einfachen linearen Liste hinzu. Wie Sie sehen können, verwenden wir den Typ der Basisklasse. Das heißt, wir können hier sowohl Einzelaufgaben als auch Aufgabenlisten in derselben Datenstruktur speichern. Das heißt, die Unterelemente sind hier also einfach vom Typ Aufgabe und da wir nun nicht mehr unterscheiden müssen, ob wir Einzelaufgaben oder Aufgabenlisten hinzufügen, reicht auch eine Datenstruktur zum Vorhalten dieser Objekte. So sieht also die Lösung für unser Problem aus und das ist das Entwurfsmuster Kompositum.

Grundlagen der Programmierung: Entwurfsmuster

Erhalten Sie einen fundierten Einstieg in das Thema Entwurfsmuster (Design Patterns) und erfahren Sie, wie Sie Entwurfsmuster in objektorientierten Programmiersprechen umsetzen.

2 Std. 49 min (33 Videos)
Sehr gut
Gilbert Z.
Sehr gut, verständlich und interessant.
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!