O padrão Composite permite organizar objetos em estruturas de árvore para representar hierarquias parte-todo. Com ele, clinetes tratam elementos individuais e composições de elementos de maneira uniforme.
Participantes
- Componente: interface que declara operações comuns tento para folhas quanto para composições, incluindo métodos para menipular filhos, como adicionar, remover e obter filhos.
- Folha: representa objetos primitivos sem filhos. Implementa a interface, mas geralmente rejeita ou ignora as operações de manipulação de filhos.
- Composite: representa objetos compostos que armazenam filhos e implementam as operações delegando a execução aos componentes filhos.
Exemplo em Java
Interface base
package com.exemplo.composite;
public interface Figura {
void adicionar(Figura f);
void remover(Figura f);
Figura obterFilho(int indice);
void renderizar();
}
Composição
package com.exemplo.composite;
import java.util.ArrayList;
import java.util.List;
public class Grupo implements Figura {
private final List<Figura> elementos;
public Grupo() {
this.elementos = new ArrayList<>();
}
@Override
public void adicionar(Figura f) {
elementos.add(f);
}
@Override
public void remover(Figura f) {
elementos.remove(f);
}
@Override
public Figura obterFilho(int indice) {
return elementos.get(indice);
}
@Override
public void renderizar() {
System.out.println("Renderizando grupo com " + elementos.size() + " elemento(s)");
for (Figura f : elementos) {
f.renderizar();
}
}
}
Folha
package com.exemplo.composite;
public class Ponto implements Figura {
private final String nome;
public Ponto(String nome) {
this.nome = nome;
}
@Override
public void adicionar(Figura f) {
throw new UnsupportedOperationException("Folha não possui filhos");
}
@Override
public void remover(Figura f) {
throw new UnsupportedOperationException("Folha não possui filhos");
}
@Override
public Figura obterFilho(int indice) {
throw new UnsupportedOperationException("Folha não possui filhos");
}
@Override
public void renderizar() {
System.out.println("Renderizando ponto: " + nome);
}
}
Cliente
package com.exemplo.composite;
public class Aplicativo {
public static void main(String[] args) {
Figura raiz = new Grupo();
Figura folha1 = new Ponto("A");
Figura folha2 = new Ponto("B");
Figura subgrupo = new Grupo();
Figura folha3 = new Ponto("C");
Figura folha4 = new Ponto("D");
raiz.adicionar(folha1);
raiz.adicionar(folha2);
raiz.adicionar(subgrupo);
subgrupo.adicionar(folha3);
subgrupo.adicionar(folha4);
raiz.renderizar();
System.out.println("---");
subgrupo.renderizar();
}
}
Resultado esperado
Renderizando grupo com 3 elemento(s)
Renderizando ponto: A
Renderizando ponto: B
Renderizando grupo com 2 elemento(s)
Renderizando ponto: C
Renderizando ponto: D
---
Renderizando grupo com 2 elemento(s)
Renderizando ponto: C
Renderizando ponto: D