Padrão Composite: Compondo Objetos em Estruturas Hierárquicas

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

Tags: Composite Pattern java GoF Estrutura de Dados em Árvore Padrões de Projeto

Publicado em 10-17 14:27