Modello di progettazione composito in Java

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.

  1. 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.
  2. Foglia – Definisce il comportamento degli elementi nella composizione. È il mattoncino per la composizione e implementa il componente base. Non ha riferimenti ad altri componenti.
  3. 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