Trabalho da Disciplina Projeto Tópicos Especiais em Projeto de Sistemas de Software
Padrão de Projetos / Composite
Equipe
- Cristiane Cavalcanti
- Elson Travassos
- Renato Costa
Resumo
Este tutorial explica de forma pratica a abordagem e os objetivos do padrão de projeto Composite com uma breve explanação teórica e a utilização de um estudo de caso construído em Java para exemplificar sua aplicação.
O padrão
Composite é um Padrão de Projeto Estrutural, que propõe a disposição de objetos em uma estrutura de arvore de modo que os clientes possam interagir com objetos simples ou compostos de maneira padronizada. Para isto todos os objetos devem implementar as operações/métodos com base em uma interface, e caso o objeto seja uma composição, ele será encarregado de realizar a operação de forma recursiva em todos os seus objetos filho.
A utilização deste padrão dispensa a necessidade do cliente distinguir se o objeto a ser manipulado é simples ou composto, pois a aplicação da recursividade ocorre de forma transparente.
Os objetos são dispostos hierarquicamente em forma de árvore (todo/parte). Em que cada nó da arvore será um objeto individual ou uma composição de n objetos.
Estrutura hierarquica
[Gamma, Helm, Johnson, Vlissides]
Diagrama de classe proposto por Gamma(et al), que implementa a estrutura de arvore do tipo parte/todo descrito no composite. Em que cada item da estrutura pode ser um nó (objeto composto) ou uma folha (objeto simples) com mesma interface de acesso (operation();).
Aplicação
Utilizado quando há a necessidade de representar elementos que podem conter objetos simples ou compostos que possuem uma coleção de outros objetos que estão na mesma hierarquia de classe a que ele pertence.
Um exemplo clássico de aplicação do Composite é na criação de uma gramática para definir uma linguagem de programação. Em que pode ser utilizado uma hierarquia de classes para representar os comandos. Sendo que os comandos podem ser simples (representado por uma folha da arvore) ou compostos, quando sua constituição contem outros comandos. A classe cliente por sua vez irá tratar todos os comandos de forma uniforme (independente de serem simples ou compostos) uma vez que os métodos de operação serão herdados e logo terão a mesma assinatura. Esta transparência também se dá ao fato de que a responsabilidade pela iteração recursiva nos objetos filhos é da classe composta, desta forma eliminando a necessidade da classe cliente se envolver neste processo de iteração.
Ordenando itens de um objeto nó
Em algumas situações a ordem dos itens é relevante. Segundo James W. a depender da forma em que foi implementado a coleção nos objetos compostos a classe nó terá que realizar a tarefa de ordenação, caso a ordem pretendida seja diferente da ordem de inserção. Por exemplo pode ser necessário ordenar a coleção original alfabeticamente ou numericamente.
Estudo de Caso: Mr. Potato
Para demonstrar a aplicação do Padrão Composite foi criado um sistema que irá simular a montagem do boneco Mr. Potato. Inicialmente o boneco foi desmembrado em partes para que pudesse ser estruturado em forma de arvore do tipo todo/parte.
Os nós da árvore serão constituídos por objetos compostos que por sua vez terão objetos filhos que poderão ser objetos folha ou outros objetos compostos, e assim sucessivamente. Os objetos nós serão “corpo”, “acessórios”, “membros” e “face”. O sistema então ira percorrer toda a arvore para montar o desenho do boneco completo (todo).
Árvore do Mr. Potato

Partes do Mr. Potato
Todo do Mr. Potato
Diagrama de classes do Mr. Potato
Classe Component
Esta classe declara a assinatura do método montar(Container), que deverá ser implementado pelas classes especializadas, independente de serem compostas (Grupo.java) ou folha (Peca.java)
Classe Composite
A classe Grupo.java estende a classe MrPotato.java, implementa o comportamento –montar(Container)- dos componentes compostos que possuem filhos e realiza seu armazenamento e iteração nos objetos da coleção.
Classe Leaf
A classe Peca.java estende a classe MrPotato.java e implementa o comportamento –montar(Container)- dos componentes simples (leaf) da árvore.
Classe Cliente
Classe cliente que cria e executa uma thread a partir de um montador que devido à implementação do Composite e a recursividade nos objetos compostos irá percorrer toda a árvore do Mr. Potato com apenas uma chamada de método e o desenho será montado gradativamente.
Padrões relacionados
- Iterator
Este padrão de projeto define que para realizar a iteração completa em uma coleção não é necessário conhecer a estrutura interna e suas especificidades. Este modelo foi utilizado para realizar a iteração nas estruturas dos objetos compostos que compõem a arvore do Mr. Potato
- Observer
Este padrão define uma relação de um para muitos e quando o estado do objeto é alterado os demais são notificados. Também é conhecido como Publisher-Subscriber. Este padrão foi utilizado com a implementação do Swing para a parte gráfica do Mr. Potato para que o botão de montagem do boneco notifique os envolvidos na montagem.
- Abstract Factory
Este padrão especifica uma família de objetos e a criação de uma interface única para a instanciação de novos objetos, desta forma a classe principal não precisa especificar a classe concreta a ser instanciada. Para se obter uma maior flexibilidade e abstração o Mr. Potato é criado a partir de uma Abstract Factory.
Referências
Cooper, James W.; Design Patterns, Addison-Wesley Design Patterns Series – 1998
Gamma Erich, Helm Richard, Johnson Ralph, Vlissides John; Design Patterns; 2002
Freeman, Eric ; Padrões de Projeto – Use a Cabeça - 2005
Nenhum comentário:
Postar um comentário