Buscar

Padrão de Projeto Composite

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 8 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

UNIVERSIDADE DE SÃO PAULO 
FACULDADE DE MEDICINA DE RIBEIRÃO PRETO 
FACULDADE DE FILOSOFIA CIÊNCIAS E LETRAS DE RIBEIRÃO PRETO 
 
 
 IBM1086: PROJETO DE SOFTWARE 
 
 
 
 
 
 
 
 
 
 
 
Padrões de Projeto 
Composite 
 
 
 
 
 
 
 
Camila Aparecida 
Guilherme Guimarães 
Robson Samir 
Wilbert Dener 
 
 
Ribeirão Preto, 2017 
Introdução 
 
1.1. Padrões de projetos 
 
Somente conhecer e utilizar os princípios básicos da orientação a objetos ou de 
uma linguagem de programação, não garante o desenvolvimento de softwares 
flexíveis, reutilizáveis e de fácil manutenção. 
Em Engenharia de Software, padrão de projeto é uma solução geral para um 
problema que ocorre com frequência dentro de um determinado contexto no projeto 
de software. Um padrão de projeto não é um projeto finalizado que pode ser 
diretamente transformado em código fonte ou de máquina, ele é uma descrição ou 
modelo (template) de como resolver um problema que pode ser usado em muitas 
situações diferentes. Padrões são melhores práticas formalizadas que o programador 
pode usar para resolver problemas comuns quando projetar uma aplicação ou sistema. 
A utilização de um padrão de projeto auxilia para tornar o sistema mais fácil 
de entender e manter, fornece soluções que já foram testadas e aprovadas, facilita o 
desenvolvimento de módulos coesos e a comunicação entre os participantes do 
projeto fica mais eficiente. 
 
 
1.2. Composite 
 
Seu principal objetivo é compor objetos em estruturas de árvore para 
representar hierarquia partes-todo. Composite permite aos clientes tratarem de 
maneira uniforme objetos individuais e composições de objetos. 
Composite é um padrão de projeto de software utilizado para representar um objeto 
formado pela composição de objetos similares. Este conjunto de objetos pressupõe 
uma mesma hierarquia de classes a que ele pertence. 
Muito utilizado em aplicações gráficas, para construir diagramas complexos a 
partir de componentes simples e agrupar componentes para formar componentes 
maiores. 
Um exemplo de sua utilização seria em uma interfaces gráficas, onde um 
elemento gráfico pode ser formado pela composição de vários outros elementos. Uma 
página de internet pode conter um ou mais ícones, além de caixas de texto e vários 
outros elementos. 
 
 
 
2. Estrutura 
 
As classes e objetos participantes nesse padrão são: 
 
Componente 
 
Onde se declara a interface para objetos, implementa o comportamento padrão 
para a interface comum a todas as classes e declara uma interface para acessar 
os componentes filhos 
 
Folha 
A folha não tem nenhum componente-filho. A folha representa o objeto folha 
na composição, define o comportamento para objetos primitivos na 
composição e herda todos os métodos de Component (porém só implementa 
de fato os que lhe interessam) 
 
Composite 
 
Define o comportamento para componentes que possuam componentes-filho, 
armazena componentes-filho e implementa funções relacionadas aos 
componentes-filho na interface do Componente. 
 
Cliente 
 
Manipula objetos da composição através da interface do Componente. 
 
3. Quando usar? 
 
Quando quiser representar hierarquias partes-todos de objetos, quiser que os 
clientes sejam capazes de ignorar a diferença entre composições de objetos e objetos 
individuais, assim os clientes trataram todos os objetos na estrutura composta de 
maneira uniforme. 
4. Consequências do uso 
 
Sua utilização acarreta em alguns benefícios e algumas desvantagens. 
Seus benefícios seriam a recursividade, o composite define hierarquias de 
classe que consistem de objetos primitivos e compostos, torna o cliente simples(eles 
podem tratar estruturas compostas e objetos individuais de maneira uniforme) e torna 
mais fácil acrescentar novas espécies de componentes. Já as suas desvantagens seriam 
que a recursividade ajuda a mascarar defeitos, o projeto fica geral demais, é mais 
difícil restringir os componentes de um objeto composto e o sistema de tipagem da 
linguagem não ajuda a detectar composições erradas. 
 
 
5. Usos Conhecidos 
 
Exemplos do padrão Composite podem ser encontrados em quase todos os sistemas 
orientados a objetos. A classe View original do Model/View/Controller da Smalltalk era um 
Composite, e quase todo toolkit para construção de interfaces de usuário e frameworks 
seguiram os seus passos. É interessante observar que a versão original de View do 
Model/View/Controller tinha um conjunto de “subviews”; em outras palavras, view era tanto 
a classe Component como a classe Composite. O Release 4.0 da Smalltalk-80 revisou o 
Model/View/Controller como uma classe VisualComponent que tem subclasses View e 
CompositeView. O framework compilador RTL Smalltalk [JML92] usa o padrão Composite 
extensamente. A RTL Expression é uma classe Component para árvores de análise (parse 
trees). Ela tem subclasses, tais como BinaryExpression, que contêm objetos-filho 
RTLExpression. Essas classes definem uma estrutura composta para árvores de análise. 
RegisterTransfer é a classe Component para uma forma intermediária Single Static 
Assigment (SSA) de um programa. As subclasses Leaf, de RegisterTransfer, definem 
diferentes atribuições estáticas (static assignments) 
 
6. Padrões Relacionados 
 
 
Freqüentemente, a ligação componente-pai é usada para o padrão Chain of Responsibility. O 
padrão Decorator é freqüentemente usado com o padrão Composite. Quando decoradores e 
composições são usados juntos, eles têm normalmente uma classe-mãe comum. Assim, 
decoradores terão que suportar a interface de Component com operações como Add, Remove 
e GetChild. O Flyweight permite compartilhar componentes, porém estes não mais podem 
referenciar seus pais. O padrão Iterator pode ser usado para percorrer os compostos. O padrão 
Visitor pode ser usado para localizar operações e comportamentos que seriam de outra forma 
distribuídos entre classes Composite e Leaf. 
 
 
 
 
7. Aspectos de implementação - Exemplo 
 
Exemplo de problema: ​Sistema de gerenciamento de arquivos. 
 
Como fazer um design que atenda a requisitos como criar arquivos concretos(videos, textos, 
imagens, etc.) e arquivos pastas? 
 
 
Uma possível solução seria criar uma classe que representa arquivos que são pastas, estas 
pastas teriam uma lista de arquivos concretos e uma lista de arquivos de pastas. Porém existe 
um problema nessa possível solução, como são duas listas diferentes precisaríamos de 
métodos específicos para tratar cada uma dela, ou seja, um método para inserir arquivos e 
outro para inserir pastas, um método para excluir pastas e outro para excluir arquivos, e assim 
por diante. 
 
Sempre que quisermos inserir uma nova funcionalidade no gerenciador precisaremos criar a 
mesma funcionalidade para arquivos e pastas, o que gera um problema de métodos 
duplicados. 
 
A solução para esse problema de métodos duplicados seria utilizar uma classe base Arquivo 
para todos os arquivos, assim precisaríamos apenas de uma lista e de um conjunto de funções 
 
 
 
Assim, seria resolvido o problema dos métodos duplicados porém para fazer a diferenciação 
entre um Arquivo e uma Pasta seria necessário utilizar o “instance of” e verificar qual o tipo 
do objeto, o problema é que seria necessário fazer isso sempre. 
 
 
Uma boa solução para esses problemas seria utilizar o padrão Composite. 
 
 
 No composite a ideia principal é criar uma classe base onde exista toda a interfacenecessária para os elementos juntamente com a criação de um elemento especial que vai 
agregar os outros elementos. 
 Como no diagrama abaixo representa: 
 
 
A classe Arquivo tem esse papel , ou seja, é nela que todos os métodos são 
implementados e usados para criar arquivos e pastas. Deste como se o usuário 
tentar criar um arquivo dentro do próprio arquivo ocorrerá o disparado de um alerta. 
Como no seguinte código: 
 
 
 
Após definir essa classe, para criar um arquivo (por exemplo de vídeo), basta 
implementar um construtor. Como o código abaixo: 
 
Porém para representar a Pasta é necessário sobrescrever os métodos com 
o comportamento padrão e repassar a chamada para todos os arquivos, sejam 
arquivos pasta ou arquivos. Como o código mostra: 
 
Já essa árvore representa o comportamento da estrutura do composite. Nela os 
arquivos concretos do exemplo (gerenciador de arquivos) são as Folhas (Leaf) pois não 
podem gerar filhos e os arquivos pastas são os Nós ou Pais (Node) pois podem gerar filhos 
e fornecer operações para esses. 
 
 
 
8. Referências 
 
GAMMA, Erich et al. Padrões de Projeto: Soluções reutilizáveis de software orientado a 
objetos. 
Padroes de Projeto - Composite < acessado 10 de Novembro de 2017> https: 
//brizeno.wordpress.com

Outros materiais