Padrão de Projeto Composite Leandro Alvim Propósito do Padrão • Compor objetos em uma estrutura de árvore – Representar hierarquias de parte-todo • Tratar objetos e composições de objetos uniformemente – Mascarar ao Cliente a manipulação desses objetos Motivação - Exemplo • • • Um figura pode ser – Linha, retângulo ou texto (primitivas) Uma figura conter – Figura (composição de primitivas) O Cliente quer apenas desenhar a figura – Aspectos estruturais não são relevantes • O que é Linha ? Motivação - Exemplo • Uma figura é uma composição de uma figura com primitivas Estrutura Participantes • Component (nó) – Define a interface para os objetos da composição – Implementa o comportamento de uma interface comum para todas as composições e objetos dessas composições – Define uma inetrface para manipulação e aesso para os componentes filhos • Leaf (nó folha ou terminal) – Define o comportamento do objeto primitivo – Objeto folha de uma composição • Não possui filhos Participantes • Composite (nó nãoterminal) – Armazena componentes filhos – Define um comportamento comum para os objetos filhos – Implementa operações da interface Component que estão relacionadas aos seus componentes filhos • Client – Manipula objetos que estão contidos em composições a partir da interface Component Colaborações Aplicabilidade • Quando se quer representar hierarquias de parte-todo • Quando a distinção entre objetos e composições de objetos é irrelevante ao Cliente – Cliente trata objetos e composições uniformemente Conseqüências • Vantagens – Traz ao Cliente a simplicidade quanto a utilização de uma estrutura • Tratamento semehante para primitivas e composições – Facilidade quanto a adição de novos componentes • Não há necessidade de reestruturação do Cliente • A adição de um novo componente não altera a estrutura de outras classes da árvore – Melhor organização dos objetos primitivos • Objetos complexos são obtidos a partir da composição de objetos simples Conseqüências • Desvantagem – Quando o Cliente necessita de um conjunto restrito de componentes que encontram-se em uma composição • Solução: Utilizar uma verificação em tempo de execução Exemplo de código Component Leaf Exemplo de código Composite Exemplo de código Fim • [email protected]