Modello di design composito in Java

1. Introduzione

In questo breve tutorial, introdurremo il modello di progettazione composita in Java.

Descriveremo la struttura e lo scopo del suo utilizzo.

2. La struttura

Il pattern composito è pensato per consentire il trattamento di singoli oggetti e composizioni di oggetti, o "compositi" allo stesso modo.

Può essere visto come una struttura ad albero composta da tipi che ereditano un tipo di base e può rappresentare una singola parte o un'intera gerarchia di oggetti.

Possiamo suddividere lo schema in:

  • componente: è l'interfaccia di base per tutti gli oggetti nella composizione. Dovrebbe essere un'interfaccia o una classe astratta con i metodi comuni per gestire i compositi figli.
  • leaf: implementa il comportamento predefinito del componente di base. Non contiene un riferimento agli altri oggetti.
  • composito - ha elementi fogliari. Implementa i metodi dei componenti di base e definisce le operazioni relative ai figli.
  • client - ha accesso agli elementi di composizione utilizzando l'oggetto componente di base.

3. Esempio pratico

Ora, tuffiamoci nell'implementazione. Supponiamo di voler costruire una struttura gerarchica dei reparti in un'azienda.

3.1. Il componente di base

Come oggetto componente definiremo una semplice interfaccia Department :

public interface Department { void printDepartmentName(); }

3.2. Foglie

Per i componenti foglia, definiamo le classi per i reparti finanziari e commerciali:

public class FinancialDepartment implements Department { private Integer id; private String name; public void printDepartmentName() { System.out.println(getClass().getSimpleName()); } // standard constructor, getters, setters }

La seconda classe foglia, SalesDepartment, è simile:

public class SalesDepartment implements Department { private Integer id; private String name; public void printDepartmentName() { System.out.println(getClass().getSimpleName()); } // standard constructor, getters, setters }

Entrambe le classi implementano il metodo printDepartmentName () dal componente di base, dove stampano i nomi delle classi per ciascuna di esse.

Inoltre, poiché sono classi foglia, non contengono altri oggetti Department .

Successivamente, vediamo anche una classe composta.

3.3. L'elemento composito

Come classe composita, creiamo una classe HeadDepartment :

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); } }

Questa è una classe composta in quanto contiene una raccolta di componenti Department , nonché metodi per aggiungere e rimuovere elementi dall'elenco.

Il metodo composito printDepartmentName () viene implementato iterando l'elenco di elementi foglia e invocando il metodo appropriato per ciascuno di essi.

4. Test

A scopo di test, diamo un'occhiata a una classe CompositeDemo :

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(); } }

Innanzitutto, creiamo due istanze per i reparti finanziario e commerciale. Successivamente, creiamo un'istanza del reparto principale e aggiungiamo ad esso le istanze create in precedenza.

Infine, possiamo testare il metodo di composizione printDepartmentName () . Come ci aspettiamo, l'output contiene i nomi delle classi di ogni componente foglia :

SalesDepartment FinancialDepartment

5. conclusione

In questo articolo, abbiamo imparato a conoscere il modello di progettazione composito. Il resoconto evidenzia la struttura principale e dimostra l'utilizzo attraverso l'esempio pratico.

Come al solito, il codice completo è disponibile nel progetto Github.