Kompositum (Entwurfsmuster) - LinkFang.de





Kompositum (Entwurfsmuster)


Das Kompositum (englisch composite oder whole-part) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung, das zur Kategorie der Strukturmuster (englisch structural patterns) gehört. Es ist ein so genanntes GoF-Entwurfsmuster. Das Kompositionsmuster (composite pattern) wird angewendet, um Teil-Ganzes-Hierarchien zu repräsentieren, indem Objekte zu Baumstrukturen zusammengefügt werden.[1] Die Grundidee des Kompositionsmusters ist, in einer abstrakten Klasse sowohl primitive Objekte als auch ihre Behälter zu repräsentieren. Somit können sowohl einzelne Objekte als auch ihre Kompositionen einheitlich behandelt werden.

Verwendung

  • Implementierung von Teil-Ganzes-Hierarchien.
  • Verbergen der Unterschiede zwischen einzelnen und zusammengesetzten Objekten.

Ein typisches Beispiel für ein Kompositum sind hierarchische Dateisysteme, insbesondere ihre Repräsentation innerhalb von Dateimanagern oder Datei-Browsern als Verzeichnisse und Dateien.

Ein anderes Beispiel sind die Klassendefinitionen der grafischen Benutzeroberfläche von Java. Alle Elemente wie Schaltflächen und Textfelder sind Spezialisierungen der Klasse Component. Die Behälter für diese Elemente sind aber ebenfalls Spezialisierungen derselben Klasse. Mit anderen Worten: Alle Standardelemente werden wesentlich durch eine einzige (Kompositum-)Klasse definiert.

UML-Diagramme

Klassendiagramm

Objektdiagramm

Bestandteile

Die Komponente definiert als Basisklasse das gemeinsame Verhalten aller Teilnehmer. Sie ist im Allgemeinen abstrakt und zum Beispiel ein Verzeichniseintrag.

Das Blatt repräsentiert ein Einzelobjekt, es besitzt keine Kindobjekte und ist zum Beispiel in einem Dateiverzeichnis eine Datei.

Das Kompositum enthält Komponenten, also weitere Komposita oder auch Blätter, als Kindobjekte und repräsentiert zum Beispiel ein Verzeichnis.

Vorteile

  • einheitliche Behandlung von Primitiven und Kompositionen
  • leichte Erweiterbarkeit um neue Blatt- oder Container-Klassen

Nachteile

Ein zu allgemeiner Entwurf erschwert es, Kompositionen auf bestimmte Klassen (und damit zumeist Typen) zu beschränken. Das Typsystem der Programmiersprache bietet dann keine Hilfe mehr, so dass Typüberprüfungen zur Laufzeit nötig werden.

Beispiel

Javas AWT-Klassen sind nach dem Kompositum-Muster gebaut. Da alle von Container erben, können sie jeweils selbst wieder Elemente aufnehmen.

Das folgende Beispiel besteht aus einer Grafik-Klasse; eine Grafik kann eine Ellipse oder eine Komposition von vielen Grafiken sein. Jede Grafik implementiert eine Methode zum Ausdrucken.

Es könnten noch weitere Figuren (Rechteck etc.) oder weitere Methoden (etwa „Rotiere“) implementiert werden.

C++

class Grafik {
public:
    virtual void print() const = 0;
    virtual ~Grafik() {} // Abstrakte Klassen, von denen geerbt wird, sollten immer einen virtuellen Destruktor haben
};
 
class GrafikKompositum : public Grafik {
    std::set<Grafik const*> children;
    typedef std::set<Grafik const*>::const_iterator grIter;
public:
    void print() const {
        for (grIter it = children.begin(); it != children.end(); it++) (*it)->print();
    }
 
    void add(Grafik const* component) {
        children.insert(component);
    }
 
    void remove(Grafik const* component) {
        children.erase(component);
    }
};
 
class Ellipse: public Grafik {
public:
    void print() const {
        std::cout << "Ellipse" << std::endl;
    }
};
 
int main() {
    Ellipse ellipse1, ellipse2, ellipse3, ellipse4;
 
    GrafikKompositum grafik1, grafik2, grafikGesamt;
 
    grafik1.add(&ellipse1);
    grafik1.add(&ellipse2);
    grafik1.add(&ellipse3);
    grafik2.add(&ellipse4);
 
    grafikGesamt.add(&grafik1);
    grafikGesamt.add(&grafik2);
 
    grafikGesamt.print();
}

Java

interface Grafik {
    public void print();
}
 
class GrafikKompositum implements Grafik {
    final private List<Grafik> children = new ArrayList<Grafik>(10);
 
    @Override
    public void print() {
        for (final Grafik grafik : children) {
            grafik.print();
        }
    }
 
    public void add(final Grafik component) {
        children.add(component);
    }
 
    public void remove(final Grafik component) {
        children.remove(component);
    }
}
 
class Ellipse implements Grafik {
    @Override
    public void print() {
        System.out.println("Ellipse");
    }
}
 
public class GrafikTest {
    public static void main(final String... args) {
        Ellipse ellipse1 = new Ellipse(),
                ellipse2 = new Ellipse(),
                ellipse3 = new Ellipse(),
                ellipse4 = new Ellipse();
 
        GrafikKompositum grafik1 = new GrafikKompositum(),
                grafik2 = new GrafikKompositum(),
                grafikGesamt = new GrafikKompositum();
 
        grafik1.add(ellipse1);
        grafik1.add(ellipse2);
        grafik1.add(ellipse3);
        grafik2.add(ellipse4);
 
        grafikGesamt.add(grafik1);
        grafikGesamt.add(grafik2);
 
        grafikGesamt.print();
    }
 
    private GrafikTest() {
    }
}

Verwendung in der Analyse

Ein Kompositum ist auch als reines Daten-Muster interessant, ohne dass Operationen in den Klassen definiert werden, da es zur Repräsentation allgemeiner Baumstrukturen verwendet werden kann. Daher ist dieses Muster auch in der Analyse sinnvoll einsetzbar, z. B. zur Darstellung verschachtelter Aufträge oder Auftragnehmer (mit Unteraufträgen/Unterauftragnehmern), verschachtelter Abläufe, hierarchischer Gruppen von Dingen (Benutzergruppen, E-Mail-Listen, Artikelgruppen, organisatorische Verbünde) usw. Es muss aber darauf geachtet werden, ob solche Hierarchien tatsächlich gleichförmig sind, oder ob die inneren Ebenen verschiedene fachliche Bedeutung haben. Letzteres drückt sich z. B. darin aus, dass Begriffe wie „Gruppe“ und „Untergruppe“ fachlich unterschieden werden.

Verwandte Entwurfsmuster

  • Visitor
  • Decorator
  • Ein Design auf Basis des Kommando-Musters kann oft sinnvollerweise auch zusammengesetzte Kommandos enthalten, die nach dem Kompositum-Muster aufgebaut sind.

Weblinks

Einzelnachweise

  1. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Entwurfsmuster. 5. Auflage. Addison-Wesley, 1996, ISBN 3-8273-1862-9, S. 239.

Kategorien: Strukturmuster | Viererbande-Entwurfsmuster

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Kompositum (Entwurfsmuster) (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.