Composite Design-Muster in Java

Zusammengesetztes Designmuster in Java

1. Einführung

In diesem kurzen Tutorial stellen wir das zusammengesetzte Entwurfsmuster in Java vor.

Wir werden die Struktur und den Zweck ihrer Verwendung beschreiben.

2. Die Struktur

Das zusammengesetzte Muster soll es ermöglichen, einzelne Objekte und Zusammensetzungen von Objekten oder „Verbundwerkstoffe“ auf dieselbe Weise zu behandeln.

Es kann als Baumstruktur aus Typen betrachtet werden, die einen Basistyp erben, und es kann einen einzelnen Teil oder eine gesamte Hierarchie von Objekten darstellen.

Wir können das Muster aufteilen in:

  • component - ist die Basisschnittstelle für alle Objekte in der Komposition. Es sollte entweder eine Schnittstelle oder eine abstrakte Klasse mit den üblichen Methoden zum Verwalten der untergeordneten Verbundwerkstoffe sein.

  • leaf - implementiert das Standardverhalten der Basiskomponente. Es enthält keinen Verweis auf die anderen Objekte.

  • Komposit - hat Blattelemente. Es implementiert die Basiskomponentenmethoden und definiert die untergeordneten Operationen.

  • client - hat mithilfe des Basiskomponentenobjekts Zugriff auf die Kompositionselemente.

3. Praktisches Beispiel

Lassen Sie uns nun in die Implementierung eintauchen. Nehmen wir an,we want to build a hierarchical structure of departments in a company.

3.1. Die Basiskomponente

Als Komponentenobjekt definieren wir eine einfacheDepartment-Schnittstelle:

public interface Department {
    void printDepartmentName();
}

3.2. Blätter

Definieren wir für die Blattkomponenten Klassen für Finanz- und Vertriebsabteilungen:

public class FinancialDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}

Die zweite BlattklasseSalesDepartment, ist ähnlich:

public class SalesDepartment implements Department {

    private Integer id;
    private String name;

    public void printDepartmentName() {
        System.out.println(getClass().getSimpleName());
    }

    // standard constructor, getters, setters
}

Beide Klassen implementieren dieprintDepartmentName()-Methode aus der Basiskomponente, wo sie die Klassennamen für jede von ihnen drucken.

Da es sich um Blattklassen handelt, enthalten sie auch keine anderenDepartment-Objekte.

Als nächstes sehen wir uns auch eine zusammengesetzte Klasse an.

3.3. Das zusammengesetzte Element

Erstellen wir als zusammengesetzte Klasse eineHeadDepartment-Klasse:

public class HeadDepartment implements Department {
    private Integer id;
    private String name;

    private List childDepartments;

    public HeadDepartment(Integer id, String name) {
        this.id = id;
        this.name = name;
        this.childDepartments = new ArrayList<>();
    }

    public void printDepartmentName() {
        childDepartments.forEach(Department::printDepartmentName);
    }

    public void addDepartment(Department department) {
        childDepartments.add(department);
    }

    public void removeDepartment(Department department) {
        childDepartments.remove(department);
    }
}

This is a composite class as it holds a collection of Department components sowie Methoden zum Hinzufügen und Entfernen von Elementen zur Liste.

Die zusammengesetzteprintDepartmentName()-Methode wird implementiert, indem die Liste der Blattelemente durchlaufen und für jedes die entsprechende Methode aufgerufen wird.

4. Testen

Schauen wir uns zu Testzwecken die KlasseCompositeDemoan:

public class CompositeDemo {
    public static void main(String args[]) {
        Department salesDepartment = new SalesDepartment(
          1, "Sales department");
        Department financialDepartment = new FinancialDepartment(
          2, "Financial department");

        HeadDepartment headDepartment = new HeadDepartment(
          3, "Head department");

        headDepartment.addDepartment(salesDepartment);
        headDepartment.addDepartment(financialDepartment);

        headDepartment.printDepartmentName();
    }
}

Zunächst erstellen wir zwei Instanzen für die Finanz- und Vertriebsabteilung. Anschließend instanziieren wir die Hauptabteilung und addieren die zuvor erstellten Instanzen dazu.

Schließlich können wir die Zusammensetzungsmethode vonprintDepartmentName()testen. Wie erwartet,the output contains the class names of each leaf component:

SalesDepartment
FinancialDepartment

5. Fazit

In diesem Artikel haben wir etwas über das Composite-Entwurfsmuster gelernt. Der Artikel hebt die Hauptstruktur hervor und demonstriert den Gebrauch anhand des praktischen Beispiels.

Wie üblich ist der vollständige Code inGithub project verfügbar.