Em alguns casos, temos objetos que podem conter outros objetos do mesmo tipo (recursividade).
O padrão Composite é uma solução para tratar objetos individuais e composições de objetos de forma uniforme.
Imagine um sistema complexo onde uma caixa de pedidos pode conter tanto produtos quanto outras caixas.
Cliente acaba usando vários if e instanceof ou a recursão fica espalhada pelo sistema
if
instanceof
Aula
Unidade
interface ComponenteCurso { int calcularCargaHorária(); } class Aula implements ComponenteCurso { private int horas; public int calcularCargaHorária() { return horas; } }
class Unidade implements ComponenteCurso { private List<ComponenteCurso> componentes = new ArrayList<>(); public void adicionar(ComponenteCurso componente) { componentes.add(componente); } public int calcularCargaHorária() { int total = 0; for (ComponenteCurso componente : componentes) { total += componente.calcularCargaHorária(); } return total; } }