El patrón Composite es uno de los patrones de diseño estructurales. El patrón de diseño Composite se utiliza cuando tenemos que representar una jerarquía parte-todo.
Patrón de Diseño Composite
Cuando necesitamos crear una estructura de tal manera que los objetos en la estructura tengan que ser tratados de la misma manera, podemos aplicar el patrón de diseño Composite. Vamos a entenderlo con un ejemplo de la vida real: Un diagrama es una estructura que consiste en objetos como Círculos, Líneas, Triángulos, etc. Cuando llenamos el dibujo con un color (digamos Rojo), ese mismo color también se aplica a los objetos en el dibujo. Aquí el dibujo está compuesto por diferentes partes y todas tienen las mismas operaciones. El Patrón Composite consiste en los siguientes objetos.
- Componente Base – El componente base es la interfaz para todos los objetos en la composición, el programa cliente utiliza el componente base para trabajar con los objetos en la composición. Puede ser una interfaz o una clase abstracta con algunos métodos comunes a todos los objetos.
- Hoja – Define el comportamiento para los elementos en la composición. Es el bloque de construcción para la composición e implementa el componente base. No tiene referencias a otros componentes.
- Compuesto – Consiste en elementos hoja e implementa las operaciones en el componente base.
Aquí estoy aplicando el patrón de diseño compuesto para el escenario de dibujo.
Componente Base del Patrón Compuesto
El componente base del patrón compuesto define los métodos comunes para hojas y compuestos. Podemos crear una clase Forma
con un método dibujar(String colorRelleno)
para dibujar la forma con el color dado. Forma.java
package com.journaldev.design.composite;
public interface Shape {
public void draw(String fillColor);
}
Objetos Hoja del Patrón de Diseño Compuesto
El objeto hoja del patrón de diseño compuesto implementa el componente base y estos son los bloques de construcción para el compuesto. Podemos crear múltiples objetos hoja como Triángulo, Círculo, etc. Triangulo.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);
}
}
Circulo.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);
}
}
Objeto compuesto
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{
//colección de formas
private List shapes = new ArrayList();
@Override
public void draw(String fillColor) {
for(Shape sh : shapes)
{
sh.draw(fillColor);
}
}
//agregar forma al dibujo
public void add(Shape s){
this.shapes.add(s);
}
//eliminar forma del dibujo
public void remove(Shape s){
shapes.remove(s);
}
//eliminar todas las formas
public void clear(){
System.out.println("Clearing all the shapes from drawing");
this.shapes.clear();
}
}
Tenga en cuenta que el objeto compuesto también implementa el componente y se comporta de manera similar a la hoja, excepto que puede contener un grupo de elementos hoja. Nuestra implementación del patrón compuesto está lista y podemos probarla con un programa cliente.
Programa Cliente del Patrón de Diseño Compuesto
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");
}
}
La salida del programa cliente del patrón compuesto anterior es:
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
Puntos Importantes del Patrón Compuesto
- El patrón compuesto solo debe aplicarse cuando el grupo de objetos debe comportarse como un solo objeto.
- El patrón de diseño compuesto se puede utilizar para crear una estructura similar a un árbol. `
java.awt.Container#add(Component)
` es un gran ejemplo del patrón Compuesto en Java y se usa mucho en Swing. Artículos anteriores sobre patrones de diseño estructural: `
Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java