Il modello composito è uno dei modelli strutturali di progettazione. Il modello di progettazione composita viene utilizzato quando dobbiamo rappresentare una gerarchia parte-tutto.
Modello di Progettazione Composita
Quando dobbiamo creare una struttura in modo che gli oggetti nella struttura debbano essere trattati allo stesso modo, possiamo applicare il modello di progettazione composita. Capiamolo con un esempio della vita reale: un diagramma è una struttura che consiste in oggetti come cerchi, linee, triangoli, ecc. Quando riempiamo il disegno con un colore (ad esempio il rosso), lo stesso colore viene applicato agli oggetti nel disegno. Qui il disegno è composto da diverse parti e tutte hanno le stesse operazioni. Il modello composito è composto dai seguenti oggetti.
- Componente di Base – Il componente di base è l’interfaccia per tutti gli oggetti nella composizione, il programma client utilizza il componente di base per interagire con gli oggetti nella composizione. Può essere un’interfaccia o una classe astratta con alcuni metodi comuni a tutti gli oggetti.
- Foglia – Definisce il comportamento degli elementi nella composizione. È il mattoncino per la composizione e implementa il componente base. Non ha riferimenti ad altri componenti.
- Composito – È composto da elementi foglia e implementa le operazioni nel componente base.
Qui sto applicando il modello di progettazione composito per lo scenario di disegno.
Componente Base del Modello Composito
Il componente base del modello composito definisce i metodi comuni per le foglie e i compositi. Possiamo creare una classe Forma
con un metodo disegna(String colore)
per disegnare la forma con il colore fornito. Forma.java
package com.journaldev.design.composite;
public interface Shape {
public void draw(String fillColor);
}
Oggetti Foglia del Modello di Progettazione Composito
Il modello di progettazione composito per le foglie implementa il componente base e sono i mattoncini per il composito. Possiamo creare molteplici oggetti foglia come Triangolo, Cerchio, ecc. Triangolo.java
package com.journaldev.design.composite;
public class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color "+fillColor);
}
}
Cerchio.java
package com.journaldev.design.composite;
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color "+fillColor);
}
}
Oggetto composito
A composite object contains group of leaf objects and we should provide some helper methods to add or delete leafs from the group. We can also provide a method to remove all the elements from the group. Drawing.java
package com.journaldev.design.composite;
import java.util.ArrayList;
import java.util.List;
public class Drawing implements Shape{
//raccolta di forme
private List shapes = new ArrayList();
@Override
public void draw(String fillColor) {
for(Shape sh : shapes)
{
sh.draw(fillColor);
}
}
//aggiunta di una forma al disegno
public void add(Shape s){
this.shapes.add(s);
}
//rimozione di una forma dal disegno
public void remove(Shape s){
shapes.remove(s);
}
//rimozione di tutte le forme
public void clear(){
System.out.println("Clearing all the shapes from drawing");
this.shapes.clear();
}
}
Nota che il composito implementa anche il componente e si comporta in modo simile al foglio, tranne che può contenere un gruppo di elementi foglia. La nostra implementazione del pattern composito è pronta e possiamo testarla con un programma client.
Programma client del pattern composito
TestCompositePattern.java
package com.journaldev.design.test;
import com.journaldev.design.composite.Circle;
import com.journaldev.design.composite.Drawing;
import com.journaldev.design.composite.Shape;
import com.journaldev.design.composite.Triangle;
public class TestCompositePattern {
public static void main(String[] args) {
Shape tri = new Triangle();
Shape tri1 = new Triangle();
Shape cir = new Circle();
Drawing drawing = new Drawing();
drawing.add(tri1);
drawing.add(tri1);
drawing.add(cir);
drawing.draw("Red");
drawing.clear();
drawing.add(tri);
drawing.add(cir);
drawing.draw("Green");
}
}
L’output del programma client del pattern composito è:
Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Clearing all the shapes from drawing
Drawing Triangle with color Green
Drawing Circle with color Green
Punti importanti del pattern composito
- Il pattern composito dovrebbe essere applicato solo quando il gruppo di oggetti deve comportarsi come un singolo oggetto.
- Il design pattern composito può essere utilizzato per creare una struttura simile a un albero. `
java.awt.Container#add(Component)
` è un ottimo esempio di pattern composito in Java e viene utilizzato molto in Swing. Articoli precedenti sui pattern di progettazione strutturale: `
Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java