Padrão estrutural - composite
Intenção
Compor objetos em estruturas de arvores para representarem hierarquias partes - todas.
Composite permite aos clientes tratarem de maneira uniforme objetos individuais e composições de objetos.
Motivação
Aplicações gráficas, tais como editores de desenhos e sistemas de captura esquemática, permitem aos usuários construir diagramas complexos a partir de componentes simples. O usuário pode agrupar componentes para formar componentes ainda maiores. Uma implementação simples poderia definir classes para primitivas gráficas, tais como Texto e Linhas, além de outras classes que funcionam como recipientes (containers) para essas primitivas.
Porém, há um problema com essa abordagem: o código que usa essas classes deve tratar objetos primitivos e objetos recipientes de modo diferente, mesmo se na maior parte do tempo o usuário os trata de forma idêntica. Ter que distinguir entre esses objetos torna a aplicação mais complexa. O padrão Composite descreve como usar a composição recursiva de maneira que os clientes não tenham que fazer essa distinção.
A chave para o padrão Composite é uma classe abstrata que representa tanto as primitivas como os seus recipientes. Para o sistema gráfico, esta classe é Graphic. A Graphic declara operações tomo Draw, que é são específicas de objetos gráficos. Ela também declara operações que todos os objetos compostos compartilham, tais como operações para acessar e administrar seus filhos.
As subclasses Line, Rectangle e Text (ver diagrama de classes precedente) definem objetos gráficos primitivos Essas classes implementam Draw para desenhar linhas, retângulos e textos, respectivamente. Uma vez que as primitivas gráficas não têm filhos gráficos, nenhuma dessas subclasses implementam operações relacionadas com filhos.
A classe Picture define um agregado de objetos Graphic. Picture implementa Draw para chamar Draw em seus filhos e implementa operações relacionadas com filhos da maneira