Zusammengesetztes Entwurfsmuster in Java

1. Einleitung

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 angesehen werden, die aus Typen besteht, die einen Basistyp erben, und es kann einen einzelnen Teil oder eine ganze Hierarchie von Objekten darstellen.

Wir können das Muster aufteilen in:

  • Komponente - ist die Basisschnittstelle für alle Objekte in der Komposition. Es sollte entweder eine Schnittstelle oder eine abstrakte Klasse mit den gängigen Methoden zum Verwalten der untergeordneten Verbundwerkstoffe sein.
  • leaf - implementiert das Standardverhalten der Basiskomponente. Es enthält keinen Verweis auf die anderen Objekte.
  • zusammengesetzt - hat Blattelemente. Es implementiert die Basiskomponentenmethoden und definiert die untergeordneten Operationen.
  • client - hat über das Basiskomponentenobjekt Zugriff auf die Kompositionselemente.

3. Praktisches Beispiel

Lassen Sie uns nun in die Implementierung eintauchen. Nehmen wir an, wir möchten eine hierarchische Struktur der Abteilungen in einem Unternehmen aufbauen.

3.1. Die Basiskomponente

Als Komponentenobjekt definieren wir eine einfache Abteilungsschnittstelle :

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 Blattklasse, SalesDepartment, 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 die printDepartmentName () -Methode aus der Basiskomponente, wo sie die Klassennamen für jede von ihnen drucken.

Da es sich um Blattklassen handelt, enthalten sie auch keine anderen Abteilungsobjekte .

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

3.3. Das zusammengesetzte Element

Erstellen wir als zusammengesetzte Klasse eine HeadDepartment- 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); } }

Dies ist eine zusammengesetzte Klasse , da es eine Sammlung von hält Abteilung Komponenten sowie Methoden zum Hinzufügen und Elemente aus der Liste zu entfernen.

Die zusammengesetzte printDepartmentName () -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 eine CompositeDemo- Klasse an:

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. Danach instanziieren wir die Hauptabteilung und addieren die zuvor erstellten Instanzen dazu.

Schließlich können wir die Kompositionsmethode printDepartmentName () testen . Wie erwartet enthält die Ausgabe die Klassennamen jeder Blattkomponente :

SalesDepartment FinancialDepartment

5. Schlussfolgerung

In diesem Artikel haben wir das Composite-Entwurfsmuster kennengelernt. Die Beschreibung hebt die Hauptstruktur hervor und demonstriert die Verwendung anhand des praktischen Beispiels.

Der vollständige Code ist wie gewohnt im Github-Projekt verfügbar.