O padrão composto é um dos padrões de design estrutural. O padrão de design composto é usado quando precisamos representar uma hierarquia parte-todo.
Padrão de Design Composto
Quando precisamos criar uma estrutura de maneira que os objetos na estrutura precisam ser tratados da mesma forma, podemos aplicar o padrão de design composto. Vamos entender isso com um exemplo da vida real – Um diagrama é uma estrutura que consiste em objetos como Círculo, Linhas, Triângulo etc. Quando preenchemos o desenho com cor (digamos Vermelho), a mesma cor também é aplicada aos objetos no desenho. Aqui, o desenho é composto por diferentes partes e todas elas têm as mesmas operações. O Padrão Composto consiste nos seguintes objetos.
- Componente Base – O componente base é a interface para todos os objetos na composição, o programa cliente usa o componente base para trabalhar com os objetos na composição. Pode ser uma interface ou uma classe abstrata com alguns métodos comuns a todos os objetos.
- Folha – Define o comportamento para os elementos na composição. É o bloco de construção para a composição e implementa o componente base. Não possui referências a outros Componentes.
- Composto – Consiste em elementos de folha e implementa as operações no componente base.
Aqui estou aplicando o padrão de design composto para o cenário de desenho.
Componente Base do Padrão de Design Composto
O componente base do padrão de design composto define os métodos comuns para folhas e compostos. Podemos criar uma classe Forma
com um método desenhar(String corPreenchimento)
para desenhar a forma com a cor fornecida. Forma.java
package com.journaldev.design.composite;
public interface Shape {
public void draw(String fillColor);
}
Objetos de Folha do Padrão de Design Composto
O padrão de design composto de folha implementa o componente base e estes são os blocos de construção para o composto. Podemos criar vários objetos de folha, 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 composto
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{
//coleção de Formas
private List shapes = new ArrayList();
@Override
public void draw(String fillColor) {
for(Shape sh : shapes)
{
sh.draw(fillColor);
}
}
//adicionando forma ao desenho
public void add(Shape s){
this.shapes.add(s);
}
//removendo forma do desenho
public void remove(Shape s){
shapes.remove(s);
}
//removendo todas as formas
public void clear(){
System.out.println("Clearing all the shapes from drawing");
this.shapes.clear();
}
}
Observe que o composto também implementa o componente e se comporta de maneira semelhante à folha, exceto que pode conter grupo de elementos folha. Nossa implementação de padrão composto está pronta e podemos testá-la com um programa cliente.
Programa Cliente do Padrão de Projeto Composto
TestePadraoComposto.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");
}
}
A saída do programa cliente do padrão composto acima é:
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
Pontos Importantes do Padrão Composto
- O padrão composto deve ser aplicado apenas quando o grupo de objetos deve se comportar como um único objeto.
- Padrão de design composto pode ser usado para criar uma estrutura semelhante a uma árvore.
java.awt.Container#add(Component)
é um ótimo exemplo de padrão composto em Java e é amplamente utilizado no Swing. Artigos anteriores sobre padrões de design estruturais:
Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java