Wikipedia · einfach zusammengefasst · Stand
Kompositum (Entwurfsmuster)
Das Kompositum (englisch composite oder whole-part) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung, das zur Kategorie der Strukturmuster …
Inhalt6 Abschnitte
Grundidee und Zweck
Das Kompositum, englisch composite oder whole-part, ist ein Entwurfsmuster der Softwareentwicklung. Es gehört zu den Strukturmustern und ist ein sogenanntes GoF-Entwurfsmuster. Es wird eingesetzt, um Teil-Ganzes-Hierarchien darzustellen: Einzelobjekte und zusammengesetzte Objekte werden zu Baumstrukturen verbunden.
Die zentrale Idee besteht darin, in einer abstrakten Klasse sowohl primitive Objekte als auch ihre Behälter zu repräsentieren. Dadurch können einzelne Objekte und ganze Kompositionen einheitlich behandelt werden. Ein Client muss dann oft nicht unterscheiden, ob er gerade mit einem einzelnen Element oder mit einer Gruppe von Elementen arbeitet.
Aufbau des Musters
Das Muster besteht aus drei Grundrollen:
- Die Komponente ist die Basisklasse und definiert das gemeinsame Verhalten aller Teilnehmer. Sie ist meistens abstrakt. In einem Dateisystem kann sie zum Beispiel allgemein einen Verzeichniseintrag beschreiben.
- Das Blatt ist ein einzelnes Objekt ohne Kindobjekte. In einem Dateisystem wäre eine Datei ein Blatt.
- Das Kompositum enthält Komponenten als Kindobjekte. Diese Kindobjekte können weitere Komposita oder Blätter sein. In einem Dateisystem wäre ein Verzeichnis ein Kompositum.
So entsteht eine Baumstruktur: Ein Kompositum kann andere Elemente enthalten, diese Elemente können wiederum zusammengesetzt oder einzeln sein. Trotzdem verwenden alle dieselbe gemeinsame Schnittstelle.
Verwendung und typische Beispiele
Das Kompositum wird vor allem für Teil-Ganzes-Hierarchien verwendet. Außerdem dient es dazu, Unterschiede zwischen einzelnen und zusammengesetzten Objekten zu verbergen.
Ein typisches Beispiel sind hierarchische Dateisysteme, wie sie in Dateimanagern oder Datei-Browsern dargestellt werden. Dateien sind einzelne Elemente, Verzeichnisse sind Behälter, die Dateien und weitere Verzeichnisse enthalten können.
Ein weiteres Beispiel sind die Klassendefinitionen der grafischen Benutzeroberfläche von Java. Schaltflächen und Textfelder sind Spezialisierungen der Klasse Component. Auch Behälter für solche Elemente sind Spezialisierungen derselben Klasse. Dadurch werden viele Standardelemente wesentlich durch eine einzige Kompositum-Klasse beschrieben.
Vorteile und Grenzen
Ein wichtiger Vorteil ist die einheitliche Behandlung von Primitiven und Kompositionen. Primitive sind hier einzelne Objekte, Kompositionen sind zusammengesetzte Objekte. Beide können über dieselbe Schnittstelle angesprochen werden.
Ein weiterer Vorteil ist die leichte Erweiterbarkeit. Neue Blattklassen oder neue Container-Klassen können ergänzt werden, solange sie zur gemeinsamen Komponente passen.
Ein Nachteil entsteht, wenn der Entwurf zu allgemein wird. Dann ist es schwieriger, festzulegen, welche Klassen überhaupt in einer bestimmten Komposition vorkommen dürfen. Das Typsystem der Programmiersprache hilft dann nicht mehr ausreichend. In solchen Fällen sind Typüberprüfungen zur Laufzeit nötig.
Beispiele in C++ und Java
Das C++14-Beispiel zeigt eine Gerätehierarchie. Die Klasse Geraet ist die Komponente. Sie enthält gemeinsame Eigenschaften wie Name und NettoPreis sowie Methoden zum Hinzufügen und Entfernen von Kindobjekten. Die Klasse ZusammengesetztesGeraet ist das Kompositum und kann Teile enthalten. Ihr NettoPreis ergibt sich aus dem eigenen Preis plus den Preisen der enthaltenen Teile. Die Klasse FloppyDisk ist ein Blatt und besitzt keine Kindobjekte; deshalb lösen fuegeHinzu und entferne dort eine std::runtime_error aus.
In der Beispielausgabe haben zwei Disketten die Preise 19.99 und 29.99. Ein PC Gehaeuse mit eigenem Preis 39.99 enthält beide Disketten und hat deshalb den NettoPreis 89.97. Danach wird versucht, einer FloppyDisk ein Kindobjekt hinzuzufügen. Weil ein Blatt keine Kindobjekte haben kann, endet das Programm mit einer Fehlermeldung: FloppyDisk::fuegeHinzu.
Das Java-Beispiel zeigt Grafiken. Das Interface Graphic ist die Komponente und definiert die Methode print. CompositeGraphic ist die Komposition und enthält eine Liste von Graphic-Objekten. Ellipse ist ein Blatt und gibt beim Drucken den Text „Ellipse“ aus. Mehrere Ellipsen werden zu CompositeGraphic-Objekten zusammengefasst, diese wiederum zu einer größeren Grafik. Beim Aufruf von print auf der gesamten Grafik wird für alle vier Ellipsen der String „Ellipse“ ausgegeben.
Außerdem erwähnt der Artikel, dass Javas AWT-Klassen nach dem Kompositum-Muster gebaut sind. Da alle von Container erben, können sie jeweils selbst wieder Elemente aufnehmen.
Analyse und verwandte Muster
Das Kompositum kann auch als reines Daten-Muster genutzt werden, ohne dass Operationen in den Klassen definiert werden. Dann dient es zur Darstellung allgemeiner Baumstrukturen. In der Analyse kann es zum Beispiel verschachtelte Aufträge oder Auftragnehmer mit Unteraufträgen beziehungsweise Unterauftragnehmern beschreiben. Weitere mögliche Anwendungen sind verschachtelte Abläufe, hierarchische Benutzergruppen, E-Mail-Listen, Artikelgruppen oder organisatorische Verbünde.
Dabei muss geprüft werden, ob die Hierarchien wirklich gleichförmig sind. Wenn innere Ebenen unterschiedliche fachliche Bedeutungen haben, kann das Kompositum weniger passend sein. Ein Hinweis darauf ist, wenn Begriffe wie „Gruppe“ und „Untergruppe“ fachlich unterschieden werden.
Verwandte Entwurfsmuster sind Visitor und Decorator. Außerdem können Designs auf Basis des Kommando-Musters sinnvoll zusammengesetzte Kommandos enthalten, die nach dem Kompositum-Muster aufgebaut sind.