Java-Entwurfsmuster (design pattern): Composite

Heute werfen wir einen Blick auf das nächste Entwurfsmuster (Java design patterns) aus der Kategorie der strukturellen Muster (structural patterns) – Composite. Entwurfsmuster in dieser Kategorie befassen sich mit Klassenstrukturen wie Vererbung (inheritance) und Komposition (composition). Lies mehr über weitere Entwurfsmuster – eine Serie von Entwurfsmustern:

Was ist das Entwurfsmuster Composite?

Das Entwurfsmuster Composite ist ein Entwurfsmuster, mit dem eine Baumstruktur von Objekten erstellt wird, die es dem Klienten ermöglicht, mit einzelnen Objekten und ihren Gruppierungen (Composites) auf dieselbe Weise zu arbeiten, da sie dieselbe Schnittstelle haben.

Welches Problem wird durch das Entwurfsmuster Composite gelöst?

Bei der Arbeit mit Baumstrukturen müssen Programmierer oft zwischen einem Blattknoten und einem Zweig unterscheiden. Das macht den Code komplexer und damit fehleranfälliger. Die Lösung ist eine Schnittstelle, mit der komplexe und primitive Objekte einheitlich behandelt werden können. Das Problem, das Composite löst, ist die Notwendigkeit, mit Objekten und ihren Zusammensetzungen auf einheitliche Weise zu arbeiten. Dadurch kann der Klient die gesamte Baumstruktur rekursiv durchlaufen und bearbeiten, ohne zwischen einzelnen Objekten und deren Gruppierungen unterscheiden zu müssen.

Beispiel einer Composite Implementierung in Java

Jetzt werden wir zeigen, wie man das Composite Muster in Java implementiert. Wir werden eine komplexe Baumstruktur erstellen, die sowohl aus einzelnen Objekten (Blättern) als auch aus Kompositionen von Objekten (Zweigen) besteht. Durch die Verwendung des Composite Musters erreichen wir eine einheitliche Ausführung von Operationen auf einzelnen Teilen des Baums, unabhängig vom Typ. Die Schnittstelle CastStromu stellt eine gemeinsame Schnittstelle sowohl für Blattknoten(List) als auch für zusammengesetzte Knoten(Vetva) dar. Diese Schnittstelle definiert die Methode vykonajOperaciu(), die der Schlüssel zu diesem Muster ist. CastStromu.java

package designpatterns;

// CastStromu - rozhranie pre všetky objekty v strome
public interface CastStromu {
    void vykonajOperaciu();
}

Die Klasse List stellt eine Listenkomponente in einer Hierarchie dar. Implementiert die Schnittstelle CastStromu und bietet eine Implementierung der Methode vykonajOperaciu(). Blattkomponenten haben keine untergeordneten Elemente und führen Operationen aus. List.java

package designpatterns;

// List - konkrétna časť stromu reprezentujúca list v strome
public class List implements CastStromu {
    private String id;

    public List(String id) {
        this.id = id;
    }

    public void vykonajOperaciu() {
        System.out.println("Vykonávam operáciu na liste s názvom: " + id);
    }
}

Die Klasse Vetva repräsentiert eine zusammengesetzte Komponente in der Hierarchie. Sie implementiert auch die Schnittstelle CastStromu und verwaltet eine Sammlung (castiStromu) von untergeordneten Komponenten, die entweder Blattkomponenten oder andere zusammengesetzte Komponenten sein können. Die Methode pridajCast() ermöglicht das Hinzufügen von untergeordneten Komponenten und damit den Aufbau einer hierarchischen Struktur. Vetva.java

package designpatterns;

import java.util.ArrayList;

// Konkrétna časť stromu reprezentujúca vetvu v strome
public class Vetva implements CastStromu {
    private String id;
    private java.util.List<CastStromu> castiStromu = new ArrayList<>();

    public Vetva(String id) {
        this.id = id;
    }

    public void pridajCast(CastStromu cast) {
        castiStromu.add(cast);
    }

    public void vykonajOperaciu() {
        System.out.println("Vykonávam operáciu na vetve s názvom: " + id);
        for (CastStromu cast : castiStromu) {
            cast.vykonajOperaciu();
        }
    }
}

In der main-Methode wird eine Instanz der Wurzelkomponente (kmenovaVetva) erstellt, und es werden ihr untergeordnete Komponenten hinzugefügt (sowohl Blattkomponenten als auch zusammengesetzte Komponenten). Wenn die Methode vykonajOperaciu() auf der Wurzelkomponente (kmenovaVetva) aufgerufen wird, ruft sie rekursiv die Methode vykonajOperaciu() auf allen untergeordneten Komponenten auf, was dazu führt, dass Operationen auf der gesamten Struktur ausgeführt werden. Main.java

import designpatterns.*;

public class Main {
    public static void main(String[] args) {
        // Vytvorí strom z listov a vetiev
        System.out.println("Skladám strom z kmeňa, listov a vetiev.");
        List list1 = new List("List 1");
        List list2 = new List("List 2");
        List list3 = new List("List 3");

        Vetva vetva1 = new Vetva("Vetva 1");
        vetva1.pridajCast(list1);
        vetva1.pridajCast(list2);

        Vetva vetva2 = new Vetva("Vetva 2");
        vetva2.pridajCast(list3);

        Vetva kmenovaVetva = new Vetva("Kmeň");
        kmenovaVetva.pridajCast(vetva1);
        kmenovaVetva.pridajCast(vetva2);

        // Vykonáva operáciu na celej stromovej štruktúre
        kmenovaVetva.vykonajOperaciu();
    }
}

Die Ausgabe dieses Beispiels ist:

Java Code Ausgabe aus dem Composite Beispiel
Code-Ausgabe

Java Composite Zusammenfassung

Das Entwurfsmuster Composite wird in Situationen verwendet, in denen es notwendig ist, einheitlich mit einzelnen Objekten und deren Gruppierungen zu arbeiten. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Java Composite Code hier herunter .

Über den Autor

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Informieren Sie uns über sich