Builder e Composite: padrões para a sua caixa de ferramentas

Tamanho: px
Começar a partir da página:

Download "Builder e Composite: padrões para a sua caixa de ferramentas"

Transcrição

1 Builder e Composite: padrões para a sua caixa de ferramentas Boas práticas de desenho/projeto de software Como construir diferentes representações de objetos passo-a-passo e trabalhar com estruturas hierárquicas LEANDRO LUQUE E RODRIGO ROCHA SILVA De que se trata o artigo: O artigo aborda dois padrões de projeto, Builder e Composite, essenciais para a caixa de ferramentas de qualquer desenvolvedor de software, uma vez que é frequente a ocorrência de cenários nos quais a aplicação destes padrões é possível. Para que serve: Para o estudo de boas práticas de desenho/projeto de software orientado a objetos e como guia para empregar os padrões abordados. Em que situação o tema útil: Como a construção de diferentes representações de objetos passo-a-passo e a ocorrência de estruturas hierárquicas é frequente em vários domínios, o conhecimento de boas práticas a eles relacionadas é importante e auxilia no desenvolvimento de software com maior produtividade e melhor qualidade. Builder e Composite: padrões para a sua caixa de ferramentas: Para serem competitivos no cenário atual de desenvolvimento de software, desenvolvedores precisam continuamente aumentar sua produtividade e melhorar a qualidade de seus produtos. Padrões de projeto desempenham um papel de destaque neste contexto, uma vez que podem ser entendidos como uma forma de reuso de soluções para problemas comuns de desenho/projeto de software. Destes problemas, a construção de diferentes representações de objetos passo-a-passo e a ocorrência de estruturas hierárquicas é frequente em vários domínios. Os padrões de projeto Builder e Composite, abordados no artigo, documentam boas práticas relacionadas a estes problemas e auxiliam na modelagem de soluções flexíveis e eficazes.

2 Em diferentes projetos de software, existem características, oportunidades e problemas semelhantes. Podem ser citados como exemplo: criação e gerenciamento de fontes de recursos, centralização do controle de requisições, portabilidade para diferentes Sistemas Gerenciadores de Bancos de Dados (SGBDs), entre outros. Essa semelhança possibilita o reaproveitamento de estratégias e soluções, o que é importante frente ao cenário atual de desenvolvimento de software, no qual é necessário maior produtividade e melhor qualidade para ser competitivo. Padrões de projeto desempenham um papel de destaque neste contexto, uma vez que podem ser entendidos como uma forma de reuso de soluções para problemas comuns de desenho/projeto de software. Um padrão de projeto geralmente especifica um nome, a descrição de um problema/motivação para seu uso, uma solução para o problema apresentado e as consequências da sua aplicação. Além de auxiliarem no aumento da produtividade, principalmente por permitirem o reuso de soluções, e no desenvolvimento de projetos com melhor qualidade, por meio do uso de soluções flexíveis, testadas e documentadas, os padrões de projeto definem um vocabulário comum para a discussão dos problemas para os quais propõem soluções 1. Os padrões de projeto ganharam popularidade com o livro Design Patterns: elements of reusable object-oriented software 2, no qual foram catalogados vinte e três padrões, que foram classificados tanto de acordo com seu propósito (Tabela 1) quanto de acordo com sua intenção (Tabela 2). Propósito Padrões de Projeto Criação Factory Method, Abstract Factory, Builder, Prototype e Singleton. Criação e inicialização de objetos. Estrutura Adapter, Bridge, Composite, Decorator, Facade, Flyweight e Proxy. Composição de classes ou objetos. Comportamento Interpreter, Template Method, Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy e Visitor. Interação e distribuição de responsabilidades entre classes e objetos. Tabela 1. Classificação dos 23 padrões de projeto proposta pelos autores do livro Design Patterns. Intenção Padrões de Projeto Interfaces Adapter, Bridge, Composite e Facade. Oferecer interfaces. Responsabilidade Chain of Responsibility, Flyweight, Mediator, Observer, Proxy e Singleton. Atribuir responsabilidades. Construção Abstract Factory, Builder, Factory Method, Memento e Prototype. Construir classes ou objetos. Operações Command, Interpreter, State, Strategy e Template Method. Controlar formas de operação. Extensões Decorator, Iterator e Visitor. 1 Apesar de todas essas qualidades, o uso de padrões de projeto deve sempre contar com bom senso. Se forem mal interpretados e empregados, podem diminuir a compreensão do seu projeto e aumentar desnecessariamente a quantidade de código. 2 Padrões de Projeto: soluções reutilizáveis de software orientado a objetos. O livro foi publicado por Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, que ficaram conhecidos como Gangue dos Quatro, GoF ou Go4 (Gang of Four).

3 Implementar extensões. Tabela 2. Classificação dos 23 padrões de projeto proposta por Steven John Metsker no livro Design Patterns in Java. Além dos padrões descritos no livro Design Patterns, diversos outros foram catalogados e publicados, tais como: Patterns of Enterprise Application Architecture, Core J2EE Design Patterns: best practices and design strategies, entre outros. Neste artigo, serão abordados dois padrões de projeto: Builder e Composite. O primeiro pode ser empregado com qualquer objeto para o qual seja necessário construir passo-a-passo diferentes representações nestes casos, pode-se dizer que o processo de construção do objeto é complexo. Composite, por sua vez, pode ser empregado na organização e tratamento de estruturas hierárquicas. Como ambos os padrões podem ser empregados com estruturas hierárquicas já que a construção deste tipo de estrutura geralmente envolve processos complexos e o padrão Builder se aplica nesse caso, inicialmente serão analisados alguns domínios nos quais tais estruturas aparecem. Exemplos de domínios nos quais surgem estruturas hierárquicas Venda de produtos Em sistemas de venda de produtos, geralmente existem classes que representam os diferentes tipos de produtos comercializados. Como exemplo, veja, na Figura 1, parte do diagrama de classes de domínio de um sistema para lojas de computadores. Nele, as classes HD, Memoria e PlacaRede representam tipos de produtos vendidos pela loja. Figura 1. Diagrama de classes de uma loja de computadores. Nesses sistemas, também é comum encontrar produtos que são compostos por outros, como é o caso do gabinete do computador, que pode ser composto por HD, Memoria, entre outros. A relação entre essas classes define uma estrutura hierárquica, neste caso, uma árvore. No sistema da loja de computadores, por exemplo, os produtos de um pedido poderiam ser representados pela estrutura da Figura 2.

4 Pedido HD Memoria Gabinete HD Memoria PlacaRede... Figura 2. Estrutura hierárquica em forma de árvore representando um pedido de memória, HD e um gabinete. Essas mesmas características podem ser observadas em sistemas de venda de outros tipos de produto, como: Livros, CDs e DVDs que são vendidos individualmente e em combinações (combos); Itens de roupa vendidos individualmente e em conjunto (como uniformes); Cardápios de lanchonetes e restaurantes, nos quais existem diferentes tipos de pratos e lanches, sendo alguns deles compostos por outros (como o sistema de pedido por números adotado em muitas lanchonetes). Interface gráfica Interfaces gráficas são compostas por diferentes tipos de componentes (rótulos, caixas de texto, caixas de seleção, listas, entre outros), cada um com propriedades e comportamento próprio. Além destes, existem componentes, como janelas e painéis, formados por outros componentes. A Figura 3 apresenta um diagrama de classes simplificado para interfaces gráficas que ilustra a estrutura hierárquica formada pela relação entre seus componentes a API Swing é um exemplo de sistema de interface gráfica no qual surgem estruturas hierárquicas. Figura 3. Estrutura hierárquica de classes para interfaces gráficas. As classes Rotulo e CaixaTexto representam componentes primitivos, que não são compostos por outros, enquanto a classe Painel representa um componente composto por outros. Em alguns sistemas de representação de entes geométricos (pontos, linhas, polígonos), uma estrutura similar pode ser observada, como é o caso da biblioteca TerraLib desenvolvida pelo INPE. Construção de consultas A flexibilidade de um sistema para permitir que seus usuários possam produzir consultas e relatórios personalizados não previstos em tempo de desenvolvimento é um diferencial importante para qualquer aplicação. Para que tal funcionalidade possa ser implementada, deve existir alguma forma de especificar consultas em tempo de execução.

5 Esse tipo de abordagem foi proposto como um padrão, chamado Query Object, por Martin Fowler, no livro Patterns of Enterprise Application Architecture. A API Criteria do Hibernate é um exemplo de implementação deste padrão, na qual existem diferentes tipos de critérios de consulta, como expressões simples de igualdade, diferença, entre outros. Alguns desses critérios, como os lógicos, podem ser compostos por outros. Assim como para o caso da venda de produtos, uma estrutura hierárquica de árvore surge para esse caso. Estruturas como as apresentadas anteriormente surgem em praticamente todos os domínios. Portanto, conhecer os problemas a elas associados é importante para qualquer desenvolvedor de sistemas. Problemas relacionados a estruturas hierárquicas Quando se trabalha com estruturas hierárquicas, tem-se que lidar com questões relacionadas à sua organização, alteração, entre outras. Em alguns casos, essas questões podem se tornar um problema, como quando a estrutura é composta por muitas classes e alterações devem ser realizadas em cada uma delas. O padrão de projeto Composite, que será estudado a seguir, auxilia na solução de problemas relacionados à organização e ao tratamento de estruturas hierárquicas. Para entender o cenário no qual este padrão se aplica, será analisada uma característica comum a todos os domínios apresentados anteriormente. Além do surgimento de estruturas hierárquicas, em todos eles existem operações que podem ser realizadas, tanto em objetos individuais, quanto naqueles que eram compostos de outros. Para o caso da venda de produtos, por exemplo, é necessário obter o preço do produto tanto para produtos individuais, como placas de rede e memórias, quanto para compostos, como gabinetes completos. Para a construção de consultas, é necessário validar e gerar instruções SQL para critérios individuais, como critérios de igualdade, e compostos, como alguns critérios lógicos. Em sistemas de interface gráfica, por sua vez, cada elemento individual, como caixas de texto, ou composto, como painéis, deve ser desenhado. Essas características configuram-se como um cenário apropriado para a aplicação do padrão Composite. Como exemplo ilustrativo da aplicação deste padrão será adotado um sistema de disco virtual, que permite aos seus usuários armazenar e organizar arquivos na Internet. Durante a etapa de modelagem desse sistema, o diagrama de classes representado na Figura 4 foi definido. Nessa figura, estão representadas as duas principais classes de domínio desse sistema: Pasta e Arquivo. Essas classes possuem atributos, métodos e estão relacionadas de forma a permitir que diversas operações possam ser realizadas, tais como o upload e download de arquivos, a criação e exclusão de pastas, entre outras.

6 Figura 4. Diagrama de classes inicial do disco virtual. Algumas destas, como a exclusão, precisam ser realizadas tanto em pastas quanto em arquivos. Para isso, foram definidos métodos para realizá-las tanto na classe Pasta quanto na classe Arquivo, como é o caso de excluirpasta(pasta) e excluirarquivo(arquivo). As pastas e arquivos do disco são apresentados para o usuário por meio de uma estrutura de árvore. Quando o usuário seleciona um item na árvore 3 e, em seguida, alguma opção, como excluir, o código recupera o item atualmente selecionado, verifica qual é seu tipo e executa o método apropriado. Para o caso da exclusão, por exemplo, essa sequência pode ser vista no código da Listagem 1. Se o item for uma pasta, o método excluirpasta() exclui recursivamente todas as pastas e arquivos nela armazenados (Listagem 2). Listagem 1. Código que trata uma solicitação de exclusão de algum nó no disco virtual. 1 //... 2 // se o item selecionado na interface gráfica for uma pasta: 3 if(arvore.getnoselecionado() instanceof Pasta) { 4 ((Pasta)arvore.getNoSelecionado()).excluirPasta(); 5 } 6 // se o item selecionado na interface gráfica for um arquivo: 7 else if(arvore.getnoselecionado() instanceof Arquivo) { 8 ((Arquivo)arvore.getNoSelecionado()).excluirArquivo(); 9 } 10 //... Listagem 2. Código da classe Pasta que exclui recursivamente as subpastas e os arquivos. 1 //... 2 public void excluirpasta() { 3 // itera por todas as subpastas. 4 Iterator<Pasta> subpastas = getsubpastas(); 5 while(subpastas.hasnext()) { 6 Pasta subpasta = subpastas.next(); 7 subpasta.excluirpasta(); 8 remove(subpasta); 9 } // itera por todos os arquivos. 3 Para efeito de simplicidade dos códigos apresentados, assume-se que a árvore gráfica da aplicação é representada por um objeto chamado arvore, cujo método getnoselecionado() retorna um Object representando o item (nó) atualmente selecionado na árvore, que pode ser uma pasta ou arquivo.

7 12 Iterator<Arquivo> arquivos = getarquivos(); 13 while(arquivos.hasnext()) { 14 Arquivo arquivo = arquivos.next(); 15 arquivo.excluirarquivo(); 16 remove(arquivo); 17 } 18 //... código para excluir a pasta atual. 19 } No código da Listagem 1, foi utilizado o método getnoselecionado() para recuperar um objeto que representa um arquivo ou uma pasta. Em seguida, foi verificado a qual tipo se refere e executado o método apropriado. Essa mesma verificação foi feita no código do método excluirpasta(), descrito na Listagem 2. Embora este tipo de abordagem seja válido, o código poderia ter sido simplificado se tivesse sido criada uma classe abstrata ou interface que declarasse os métodos comuns às pastas e arquivos e se fosse aproveitado o polimorfismo para realizar as operações citadas anteriormente (Figura 5), o que permitiria o tratamento uniforme de pastas e arquivos. Figura 5. Diagrama de classes do disco virtual de acordo com o padrão Composite. Os códigos das Listagens 3 e 4 mostram como ficaria o código das operações descritas nas Listagens 1 e 2, respectivamente. Listagem 3. Código que trata uma solicitação de exclusão de algum nó no disco virtual (nova versão). 1 //... 2 ((Item)arvore.getNoSelecionado()).apagar(); 3 //... Listagem 4. Código da classe Pasta que exclui recursivamente as subpastas e os arquivos (nova versão). 1 //... 2 public void apagar() { 3 // itera por os itens. 4 Iterator<Item> itens = getitens(); 5 while(itens.hasnext()) { 6 Item item = itens.next(); 7 item.apagar();

8 8 remove(item); 9 } //... código para excluir a pasta atual. 12 } Não é difícil perceber que o modelo e o código foram otimizados, envolvendo, além da redução do código, um aumento da flexibilidade do sistema para definição de novas classes, já que tipos especiais de arquivos ou pastas podem ser incluídos sem que os códigos anteriores sejam modificados vantagem já bastante conhecida do uso do polimorfismo. O que foi feito quando a modelagem e código foram alterados foi utilizar o padrão Composite, cuja definição será estudada a seguir. Padrão: Composite O padrão Composite envolve a composição de objetos em estruturas de árvore a fim de expressar hierarquias do tipo todo-parte, como aquelas apresentadas nos exemplos de domínios. O padrão permite que objetos individuais (folhas/leafs), como é o caso dos arquivos no disco virtual, e composições de objetos (compostos/composites), como é o caso das pastas, sejam tratados de maneira uniforme. O diagrama de classes que representa a estrutura desse padrão pode ser visto na Figura 6. Figura 6. Diagrama de classes do padrão Composite. Nesse diagrama, as classes Composite e Leaf representam os compostos e as folhas, respectivamente. A classe abstrata Component define os métodos comuns, tanto a folhas, quanto a compostos, o que nos permite, por meio do polimorfismo, tratar folhas e compostos de modo indiferente. A classe Client, por sua vez, representa alguma classe que utiliza a estrutura hierárquica, como é o caso das classes representadas nas Listagens 3 e 4 para o disco virtual. No diagrama do disco virtual, a classe Component é representada pela classe Item e as classes Composite e Leaf são representadas por Pasta e Arquivo, respectivamente. Da forma como foi definido no diagrama da Figura 6, a classe abstrata Component carrega não só os métodos comuns a folhas e compostos, mas também métodos específicos para compostos, como add(), remove() e getchildren(). Esse é um ponto que gera bastante discussão e confusão sobre o padrão.

9 Embora os métodos add(), remove(), entre outros, não façam sentido para folhas, essa abordagem permite manter uma transparência alta para o cliente, uma vez que ele não precisa saber se está lidando com folhas ou compostos. Entretanto, há uma redução da coesão da classe Leaf, porque possui métodos que para ela não fazem sentido. A implementação desses métodos para Leaf pode ser feita de diferentes formas. Uma ideia seria definir uma implementação padrão para esses métodos na classe Component que gere uma exceção (Listagem 5). Essa implementação será sobrescrita por Composite, mas não por Leaf. Portanto, quando os métodos forem executados para folhas, exceções serão lançadas. Outra ideia seria os métodos não fazerem nada, isto é, não executarem código algum. Listagem 5. Código da classe Component que gera, por padrão, exceções para os métodos específicos de compostos. 1 public abstract class Component { 2 3 public abstract void operation(); 4 5 public void add(component component) { 6 throw new UnsupportedOperationException("Operação não suportada!"); 7 } 8 9 public void remove(component component) { 10 throw new UnsupportedOperationException("Operação não suportada!"); 11 } public Component[] getchilden() { 14 throw new UnsupportedOperationException("Operação não suportada!"); 15 } 16 } Uma questão que naturalmente pode surgir é: em que caso pode ser interessante manter uma transparência alta para o cliente interface completamente comum para compostos e folhas e criar soluções para quando alguns métodos forem indevidamente chamados? Na verdade, em poucos casos, esse tipo de abordagem é útil e permite alguma simplificação no código de operações que trabalham com a estrutura hierárquica. Veja um exemplo: deseja-se armazenar um arquivo em todas as pastas do disco virtual, por exemplo, um arquivo.txt, com a lista das subpastas e dos arquivos da pasta outra ideia seria gerar um arquivo que armazena miniaturas das subpastas e dos arquivos da pasta para otimizar sua exibição, semelhante ao que o Windows faz com o arquivo Thumbs.db. Se não for mantida uma interface comum para pastas e arquivos que contenha os métodos necessários para gerar o arquivo.txt, será necessário diferenciar pastas e arquivos no código de geração. Assumindo que tenha sido criado, na classe Pasta, um método chamado gerarlista(), que cria um arquivo.txt com a lista de subpastas e arquivos da pasta, o código da Listagem 6 mostra como poderia ficar o código para gravar os arquivos.txt em cada pasta do disco. Listagem 6. Código que gera os arquivos txt para o disco virtual (versão com interfaces diferentes para Pasta e Arquivo). 1 //... 2 // para cada item do disco virtual: 3 // (nome do item atualmente em processamento: item). 4 if(item instanceof Pasta) { 5 ((Pasta)item).add(((Pasta)item).gerarLista()); 6 } 7 //... Por outro lado, se for mantida uma interface comum para Pasta e Arquivo tal que a classe Component forneça uma implementação padrão, que não faça nada, para o

10 método gerarlista(), conforme especificado na Figura 7, pode-se simplesmente processar todos os itens do disco, executar o método gerarlista(), para gerar o arquivo.txt com a lista de subpastas e pastas da pasta, e o método add() para adicionar o arquivo à pasta. Se o item processado for um arquivo, nada ocorrerá. Se for uma pasta, o arquivo passado por parâmetro será gravado (Listagem 7). Listagem 7. Código que gera os arquivos txt para o disco virtual (versão com interfaces iguais para Pasta e Arquivo). 1 //... 2 // para cada item do disco virtual: 3 // (nome do item atualmente em processamento: item). 4 item.add(item.gerarlista()); 5 //... Esse exemplo mostra porque pode ser interessante manter uma interface comum que, a princípio, pareça conter métodos não significativos para nós folhas para ambos os tipos de nós. Figura 7. Diagrama de classes do disco virtual com mais métodos na interface comum para pastas e arquivos. Como regra, defina na interface comum apenas os métodos para os quais não se deseja fazer distinção entre folha e composto (Figura 8).

11 Figura 8. Diagrama de classes alternativo do padrão Composite. Caso existam vários tipos de compostos e folhas, outras classes abstratas ou interfaces podem ser incluídas no diagrama para manter o que há de comum entre cada um deles em diferentes níveis. A Tabela 3 apresenta um quadro resumo do padrão Composite. Padrão: Composite Classificação Objetivo Estrutura/Interface Compor objetos em uma estrutura de árvore de modo a permitir que clientes tratem, de maneira uniforme, objetos compostos e folha. Problema/Motivação Em muitos sistemas orientados a objetos surgem estruturas hierárquicas de árvore. Muitas vezes, o tratamento diferenciado de objetos compostos e folha resulta em um aumento desnecessário da complexidade do código a ser desenvolvido. Solução Definir uma interface comum (através de classes abstratas ou interfaces) para objetos compostos e folha. Participantes Ver Figura 5 ou 6. Component: classe abstrata ou interface que define o comportamento comum a objetos compostos e folhas; Leaf: subclasse de Component que representa objetos folha; Composite: subclasse de Component que representa objetos compostos; Client: classe que utiliza a estrutura hierárquica formada por componentes. Consequências Torna transparente o tratamento dos componentes da hierarquia, ou seja, permite que objetos compostos e folha sejam tratados de modo indiferente. Facilita a adição de novos tipos de componentes, já que o cliente não precisa mudar quando isso ocorrer. Permite o tratamento de estruturas hierárquicas como um todo, através da chamada de métodos no objeto composto raiz que dispara, recursivamente, métodos em seus componentes.

12 Implementação Dependendo da implementação, a relação entre componentes pode ficar geral demais, o que torna mais difícil a restrição dos possíveis componentes de um objeto composto. A classe Component declara uma interface comum que é implementada nas classes Leaf e Composite. Client utiliza a interface comum de Component para trabalhar com objetos compostos e folhas. Na implementação do padrão, deve-se atentar para a ocorrência de ciclos nas relações entre componentes, pois isto pode resultar em loops infinitos. Um componente pode guardar alguma referência explícita ao componente pai, se for necessário. Tabela 3. Quadro resumo do padrão Composite. Uma aplicação bastante útil do padrão Composite diz respeito à composição dinâmica de interfaces gráficas. Como exemplo desse tipo de aplicação, será admitido o cenário seguinte. Na interface gráfica do disco virtual, deseja-se que o usuário possa enxergar a estrutura de pastas e arquivos tanto através de uma árvore Javascript, quanto através de HTML puro. Além disso, deseja-se personalizar outras partes da interface de acordo com preferências especificadas por usuários. Alguns dos usuários, por exemplo, preferem enxergar a árvore do lado direito da interface, enquanto outros preferem trabalhar com elas do lado esquerdo. O que é necessário para criar tal interface é alguma solução que permita compor dinamicamente uma interface a partir de um layout especificado. O padrão Java EE Composite View, baseado no padrão Composite, foi criado com esse propósito. Ele permite que sejam criadas interfaces gráficas compostas de outras (Figura 9), nas quais o conteúdo e o layout possam ser separados e compostos dinamicamente. Diversos frameworks Java, como Facelets (JSF) e Tiles (Struts), implementam o padrão Composite View. Figura 9. Diagrama de classes do padrão Composite View. Continuando o estudo dos padrões de projeto, será apresentado a seguir um cenário no qual o padrão Builder pode ser empregado. Atualmente, quando necessitam fazer o download de uma pasta inteira, os usuários do disco virtual precisam fazê-lo arquivo por arquivo, o que é muito cansativo. Por este motivo, foram recebidas muitas solicitações para que uma nova funcionalidade de download, que permite o download de pastas inteiras em algum formato de compressão, como ZIP e TAR, seja disponibilizada no sistema.

13 Para oferecer essa nova funcionalidade, poderiam ser escritas diversas classes, uma para cada formato de compressão, que processam a estrutura de pastas do disco e criam o arquivo comprimido. Essa abordagem, no entanto, envolveria a repetição do código de processamento de pastas do disco em todas as classes de criação, o que não é interessante. Para evitar tal repetição, pode ser criada uma classe responsável pelo processamento de pastas que, para cada item do disco, seja pasta ou arquivo, envia uma mensagem para uma classe de compressão que, por sua vez, cria o arquivo comprimido. Essa solução, com o acréscimo de alguns detalhes, é a implementação do padrão de projeto Builder. O diagrama de classes da Figura 10 especifica uma solução para o problema de geração de arquivos comprimidos no disco virtual. Figura 10. Diagrama de classes da funcionalidade de exportação de arquivos comprimidos do disco virtual. Pode-se observar, nesse diagrama, que existe uma classe para processar a estrutura de pastas, AnalisadorItem, e outras que geram cada um dos arquivos comprimidos, CompressorZip e CompressorTAR. A geração dos arquivos comprimidos é conduzida por AnalisadorItem através de sucessivas chamadas feitas aos métodos criarnocomposto() e criarnofolha(), definidos na classe abstrata Compressor. Essa solução separa o processo de construção de arquivos comprimidos, conduzido através da criação de nós compostos e folhas, da representação que será criada, um

14 arquivo ZIP ou um arquivo TAR. Com isso, pode-se, por exemplo, gerar um novo formato de compressão simplesmente adicionando uma nova classe de compressão adequada. Pode-se, inclusive, reaproveitar essa estrutura de classes em outras aplicações que precisam gerar diferentes arquivos comprimidos, a partir da substituição da classe AnalisadorItem por outra apropriada. Nas Listagens 8, 9 e 10, são apresentados os códigos necessários para a geração de arquivos ZIP. É importante ressaltar que na implementação da classe CompressorZIP, o método criarnocomposto() não faz nada porque as pastas (nós compostos) são representadas em um ZIP através do caminho de cada arquivo, tornando-se desnecessária a definição de alguma estrutura específica para representar pastas. Entretanto, esse método será mantido na interface Compressor para permitir que outros tipos de formatos, que envolvam a definição de estruturas específicas para pastas, funcionem corretamente. Listagem 8. Código da classe AnalisadorItem, que processa a estrutura de pastas e arquivos do disco e solicita a um Builder a construção do arquivo comprimido. 1 public class AnalisadorItem { 2 3 private Compressor compressor; 4 private Item raiz; 5 6 public AnalisadorItem(Compressor compressor, Item raiz) { 7 setcompressor(compressor); 8 setraiz(raiz); 9 } public void comprimir() { 12 // para cada item da raiz, recursivamente: 13 // (nome do item atualmente em processamento: item). 14 if(item instanceof Pasta) { 15 compressor.criarnocomposto((pasta)item); 16 } 17 else if(item instanceof Arquivo) { 18 compressor.criarnofolha((arquivo)item); 19 } 20 else { 21 throw new UnsupportedOperationException("Tipo de item desconhecido!"); 22 } 23 } // métodos de acesso. 26 public Compressor getcompressor() { return compressor; } public void setcompressor(compressor compressor) { 29 this.compressor = compressor; 30 } public Item getraiz() { return raiz; } public void setraiz(item raiz) { 35 this.raiz = raiz; 36 } 37 } Listagem 9. Código da classe abstrata Compressor, que define o comportamento comum a compressores de arquivos no disco virtual. 1 public abstract class Compressor { 2 public abstract void criarnocomposto(pasta pasta); 3 public abstract void criarnofolha(arquivo arquivo); 4 } Listagem 10. Código de um compressor para geração de arquivos.zip. 1 import java.io.fileinputstream; 2 import java.io.fileoutputstream;

15 3 import java.io.ioexception; 4 import java.util.zip.zipentry; 5 import java.util.zip.zipfile; 6 import java.util.zip.zipoutputstream; 7 8 public class CompressorZIP extends Compressor { 9 10 private ZipOutputStream out; public CompressorZIP() { 13 // cria um arquivo temporário (FileOutputStream) 14 // onde será armazenado o resultado da compressão. 15 // nome do arquivo: arquivo. 16 FileOutputStream arquivo = // out = new ZipOutputStream(arquivo); 18 } public void criarnocomposto(pasta pasta) { 22 // no caso do ZIP, não é necessário criar 23 // os nós compostos, pois cada nó folha (arquivo) carrega 24 // consigo um caminho completo que representa 25 // a pasta onde se encontra. 26 } public void criarnofolha(arquivo arquivo) { 30 try { 31 // cria uma nova entrada para o arquivo no ZIP. 32 out.putnextentry(new ZipEntry(arquivo.getCaminhoAbsoluto())); 33 // lê o arquivo e o escreve no ZIP. 34 // assume-se que o arquivo, quando é feito o upload no disco, fica armazenado 35 // em um arquivo físico, cujo endereço é armazenado no atributo caminhofisico. 36 // Ele pode ser recuperado através do método getcaminhofisico(), não 37 // representado no diagrama. 38 FileInputStream in = new FileInputStream(arquivo.getCaminhoFisico()); 39 byte[] buffer = new byte[1024]; 40 int tamanho; 41 while((tamanho = in.read(buffer)) > 0) { 42 out.write(buffer, 0, tamanho); 43 } 44 in.close(); 45 } 46 catch(ioexception erro) { 47 erro.printstacktrace(); 48 } 49 } public ZipFile get() { 52 try { 53 out.flush(); 54 out.close(); 55 } 56 catch(ioexception erro) { 57 erro.printstacktrace(); 58 } ZipFile arquivo = new ZipFile(""); 61 return(arquivo); 62 } 63 } A seguir, uma formalização do padrão Builder é apresentada. Padrão: Builder O padrão de criação Builder separa o processo de construção da estrutura de um objeto, de modo que o mesmo processo de construção possa criar várias representações diferentes. Embora não seja o caso do exemplo apresentado para o disco virtual, os objetos gerados por Builder geralmente são estruturas hierárquicas. A solução proposta pelo padrão envolve a definição de uma classe, Director, que fica responsável pela criação do objeto que deseja-se construir, chamado, genericamente, de Product.

16 A classe Director conduz passo-a-passo a criação do produto através de chamadas aos métodos de uma classe de construção. O diagrama de classes desse padrão pode ser visto na Figura 11. Figura 11. Diagrama de classes do padrão Builder. A classe Builder, representada no diagrama, é apenas uma classe abstrata que define os passos necessários para a construção de Product. Essa interface tem necessariamente que ser implementada por uma ou mais classes do tipo ConcreteBuilder, que são as responsáveis por criar alguma representação adequada de Product. No caso do disco virtual, os passos da classe Builder incluíam métodos para construir as diferentes entradas de um arquivo comprimido. O Director recebe como parâmetro a instância de um ConcreteBuilder e usa esta instância para gerenciar a criação dos passos. A Tabela 4 apresenta um quadro resumo do padrão Builder. Padrão: Builder Classificação Objetivo Criação/Construção Separar o processo de construção de um objeto (geralmente uma estrutura hierárquica) de sua representação de forma que o mesmo processo de construção possa criar diferentes representações. Problema/Motivação Muitas vezes, é necessário construir um objeto através de várias etapas de tal forma que, dependendo de parâmetros especificados, diferentes representações desse objeto sejam obtidas. Solução Definir uma interface comum a todos os montadores de objetos e executar o comportamento dessa interface passo-a-passo. Participantes Ver Figura 11. Director: constrói objetos passo-a-passo enviando mensagens a um Builder; Builder: define uma interface (classe abstrata ou interface)

17 Consequências Implementação Tabela 4. Quadro resumo do padrão Builder. que deve ser implementada pelos diferentes construtores de objeto; ConcreteBuilder: define uma implementação da interface Builder; Product: o objeto complexo em construção (inclui classes que definem as partes constituintes). Cria uma independência entre o processo de construção de um objeto de sua representação e, assim, facilita a adição de novas representações. Esconde a forma como as diferentes partes de um objeto são criadas e unidas durante sua construção. Permite um controle maior sobre o processo de construção do objeto, dado que ele é executado passo-a-passo. A classe Builder declara uma interface comum que é implementada nas classes ConcreteBuilder. Client passa um ConcreteBuilder para um Director que, através de sua interface, cria passo-a-passo um Product. No estudo do padrão Builder, podem surgir dúvidas quanto a sua diferença em relação ao padrão Abstract Factory, pois ambos podem ser utilizados na construção de objetos. No entanto, diferentemente do Abstract Factory, Builder constrói objetos passo-apasso. Conclusão O artigo abordou dois padrões de projeto que devem fazer parte da caixa de ferramentas de todo desenvolvedor de sistemas. Um deles, o padrão Builder, permite que diferentes representações de objetos possam ser construídas passo-a-passo e é geralmente empregado em objetos cujo processo de construção é complexo, como é o caso de estruturas hierárquicas. O padrão Composite, por sua vez, auxilia na organização e tratamento de estruturas hierárquicas de forma a facilitar sua manipulação e extensão. Referências Versão digital do livro Design Patterns: elements of reusable object-oriented software. Catálogo de padrões de projeto para o Java Enterprise Edition. Biblioteca virtual sobre padrões de projeto. Exemplos de código Java e C++ para os padrões de projeto do livro Design Patterns.

18 Leandro Luque É professor da Universidade de Mogi das Cruzes (UMC) e da FATEC- Mogi. Tem formação em Ciência da Computação e mestrado em Computação Aplicada pelo Instituto Nacional de Pesquisas Espaciais (INPE). Trabalha com Java há 10 anos, tendo atuado no desenvolvimento de aplicações de grande porte tanto no segmento empresarial quanto governamental. Rodrigo Rocha Silva (rrochas@gmail.com) Formado em Ciência da Computação pela Universidade de Mogi das Cruzes (UMC), mestre em Computação Aplicada pelo INPE e Doutorando pelo ITA. Trabalha com Java há mais de 6 anos, atuando como desenvolvedor, analista e arquiteto em empresas de pequeno e grande porte, nos segmentos de gestão empresarial, saúde e governo. Atua também como professor na UMC e na Veris Faculdades. Possui certificação SCJP 1.4.

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões DCC / ICEx / UFMG Padrões de Projeto Padrões de Projeto Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo Um padrão é uma descrição do problema e a essência da sua solução Documenta boas soluções para

Leia mais

Mas o que é mesmo Padrão de Projeto?

Mas o que é mesmo Padrão de Projeto? Mas o que é mesmo Padrão de Projeto? Um Padrão de Projeto descreve uma solução comprovada para um problema recorrente e conhecido no desenvolvimento de software orientado a objetos. Mas afinal, porque

Leia mais

Tópicos da Aula. POO e Padrões de Projetos. Considere três classes... Reuso de Classes. Locadora de DVD. Sistema Acadêmico

Tópicos da Aula. POO e Padrões de Projetos. Considere três classes... Reuso de Classes. Locadora de DVD. Sistema Acadêmico Reuso de Software Aula 03 Tópicos da Aula POO e Padrões de Projetos Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo reuso.software@gmail.com 12 Março 2012 Programação orientada a objetos Reuso de

Leia mais

Padrões de Projeto de Software

Padrões de Projeto de Software Padrões de Projeto de Software Lista de Exercícios AV2-01 Luiz Leão luizleao@gmail.com http://www.luizleao.com Questão 1 Qual o objetivo dos padrões Comportamentais, segundo o catálogo GOF? Questão 1 Resposta

Leia mais

Análise e Projeto. Padrões de Análise, Arquitetura e Projeto

Análise e Projeto. Padrões de Análise, Arquitetura e Projeto Análise e Projeto Padrões de Análise, Arquitetura e Projeto 33 Padrões de Arquitetura Padrões Nome do padrão Problema: quando aplicar o padrão? Descreve o problema e seu contexto. Solução: elementos que

Leia mais

" ##$#$!% # & #$#$ !!!!"!

 ##$#$!% # & #$#$ !!!!! " ##$#$!% # & #$#$ Abstract Factory, Builder, Singleton, Factory Method, Prototype, Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy, Chain of Responsability, Command, Interpreter, Iterator,

Leia mais

Programação Orientada a Objetos. Padrões Estruturais

Programação Orientada a Objetos. Padrões Estruturais Programação Orientada a Objetos Padrões Estruturais Cristiano Lehrer, M.Sc. Classificação dos Padrões de Projeto Propósito o que o padrão faz: Padrões de criação: abstraem o processo de criação de objetos

Leia mais

Universidade Federal de Uberlândia Faculdade de Computação Prof. Fabiano Dorça. Introdução. Padrões de projeto

Universidade Federal de Uberlândia Faculdade de Computação Prof. Fabiano Dorça. Introdução. Padrões de projeto Universidade Federal de Uberlândia Faculdade de Computação Prof. Fabiano Dorça Introdução Padrões de projeto Algumas definições... Um padrão de projeto (design pattern) é uma solução geral reutilizável

Leia mais

Análise e Projeto Orientados por Objetos

Análise e Projeto Orientados por Objetos Análise e Projeto Orientados por Objetos Aula 11 Padrões GoF (Bridge e Decorator) Edirlei Soares de Lima Padrões GoF Criação: Abstract Factory Builder Factory Method Prototype Singleton

Leia mais

Padrões de Projeto de Software Orientado a Objetos

Padrões de Projeto de Software Orientado a Objetos Padrões de Projeto de Software Orientado a Objetos Ricardo Argenton Ramos [Baseado nos slides do professor Fabio Kon - USP] 1 Padrões de Projeto de Software OO Também conhecidos como Padrões de Desenho

Leia mais

Análise e Projeto Orientados por Objetos

Análise e Projeto Orientados por Objetos Análise e Projeto Orientados por Objetos Aula 10 Padrões GoF (Protoype e Façade) Edirlei Soares de Lima Padrões GoF Criação: Abstract Factory Builder Factory Method Prototype Singleton

Leia mais

Módulo III Padrões GOF

Módulo III Padrões GOF Módulo III Padrões GOF Professores Eduardo Bezerra edubezerra@gmail.com Ismael H F Santos ismael@tecgraf.puc-rio.br April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br 1 Ementa Introdução aos

Leia mais

Padrões de Projeto. Parte 1. Prof. Fellipe Aleixo

Padrões de Projeto. Parte 1. Prof. Fellipe Aleixo Padrões de Projeto Parte 1 Prof. Fellipe Aleixo (fellipe.aleixo@ifrn.edu.br) Padrões de Projeto de Software OO Também conhecidos como Padrões de Projeto de Software OO ou simplesmente como Padrões A Inspiração

Leia mais

INF011 Padrões de Projeto Introdução

INF011 Padrões de Projeto Introdução INF011 Padrões de Projeto 01 - Introdução Sandro Santos Andrade sandroandrade@ifba.edu.br Instituto Federal de Educação, Ciência e Tecnologia da Bahia Departamento de Tecnologia Eletro-Eletrônica Graduação

Leia mais

Engenharia de Software

Engenharia de Software Engenharia de Software Projeto e Implementação Padrões de Projeto Msc. Carlos Mar 04/2014 REVISÃO: ORIENTAÇÃO A OBJETOS Msc. Carlos Mar - Abr/2014 Conceitos Fundamentais Classe Objeto Atributos Métodos

Leia mais

Análise e Projeto Orientados por Objetos

Análise e Projeto Orientados por Objetos Análise e Projeto Orientados por Objetos Aula 09 Padrões GoF (Adapter e Composite) Edirlei Soares de Lima Padrões GoF Criação: Abstract Factory Builder Factory Method Prototype Singleton

Leia mais

Padrões de Projeto de Software

Padrões de Projeto de Software Padrões de Projeto de Software Lista de Exercícios AV1 01 Luiz Leão luizleao@gmail.com http://www.luizleao.com Questão 1 Dentre as alternativas abaixo identifique a que NÃO define uma situação em que deve

Leia mais

b) Adapter, Bridge e Composite. c) Builder, Prototype e Singleton. d) Façade, Command e Decorator. e) Factory Method, Interpreter e Template Method.

b) Adapter, Bridge e Composite. c) Builder, Prototype e Singleton. d) Façade, Command e Decorator. e) Factory Method, Interpreter e Template Method. 1) Considere os diagramas de classes de análise fornecidos nos itens (a) e (b) abaixo, ambos de acordo com a notação da UML. Esses diagramas desejam representar o fato de que uma conta bancária pode estar

Leia mais

LEIC-T LERC MEIC-T 2011/2012 1º Semestre Programação com Objetos 2012/01/07 11h00m 3/10

LEIC-T LERC MEIC-T 2011/2012 1º Semestre Programação com Objetos 2012/01/07 11h00m 3/10 2/10 1.1. (1.5 val.) Os mecanismos de herança entre classes e de composição de objetos são, por vezes, apresentados como alternativos, face à disponibilização de funcionalidade a uma classe. Compare-os,

Leia mais

Padrões de Design Orientado a Objetos Design Patterns. Jorge H. C. Fernandes DI-UFPE, Junho de 1999

Padrões de Design Orientado a Objetos Design Patterns. Jorge H. C. Fernandes DI-UFPE, Junho de 1999 Padrões de Design Orientado a Objetos Design Patterns Jorge H. C. Fernandes DI-UFPE, Junho de 1999 Padrões de Design Bibliografia Design Patterns: Elements of Reusable Object- Oriented Software. Gamma,

Leia mais

Padrões de Projeto de Software

Padrões de Projeto de Software Padrões de Projeto de Software Luiz Leão luizleao@gmail.com http://www.luizleao.com Introdução O que é? Como descrever? Principais Padrões de Projetos Unidade 2 Padrões GoF PADRÕES CRIAÇÃO Abstract Factory

Leia mais

Programação com Objectos 2º Teste Tipo 1º Semestre (120 minutos)

Programação com Objectos 2º Teste Tipo 1º Semestre (120 minutos) 1/8 Programação com Objectos 2º Teste Tipo 1º Semestre (120 minutos) Nome: Primeira Parte (7 valores) PERGUNTA NOTA 1.1.1 1.1.2 1.1.3 1.2 1.3 1.4 Segunda Parte (3 valores) PERGUNTA RESPOSTA 2.1 2.2 2.3

Leia mais

Análise e Projeto Orientados por Objetos

Análise e Projeto Orientados por Objetos Análise e Projeto Orientados por Objetos Aula 05 Padrões GoF (Singleton e Iterator) Edirlei Soares de Lima Padrões GoF Criação: Abstract Factory Builder Factory Method Prototype

Leia mais

Padrões Comportamentais

Padrões Comportamentais Padrões Comportamentais Parte 1 Soluções Reutilizáveis de Software Orientado a Objetos Prof. Fellipe Aleixo (fellipe.aleixo@ifrn.edu.br) Padrões de Projeto Comportamentais 1. Chain of Responsibility 2.

Leia mais

Padrões de Design. Padrões de Design. Abstract Factory. Padrões de Design. Padrões de Design Abstract Factory. Abstract Factory.

Padrões de Design. Padrões de Design. Abstract Factory. Padrões de Design. Padrões de Design Abstract Factory. Abstract Factory. Escopo Classe Objeto Finalidade Criação Estrutural Comportamental Factory Method Interperter Abstract Factory Builder Prototype Bridge Composite Facade Flyweight Proxy Chain of Responsibility Command Iterator

Leia mais

Programação Orientada a Objetos. Padrões de Criação

Programação Orientada a Objetos. Padrões de Criação Programação Orientada a Objetos Padrões de Criação Cristiano Lehrer, M.Sc. Objetivos Apresentar cada um dos 23 padrões clássicos descrevendo: O problema que solucionam. A solução. Diagramas UML (Unified

Leia mais

Programação com Objectos. 2º Teste 2015/2016 1º Semestre

Programação com Objectos. 2º Teste 2015/2016 1º Semestre 1/7 2015/2016 1º Semestre 13 de Janeiro de 2016, 18:30 (120 minutos) 2º Teste Nome: Número: Primeira Parte (3 valores) PERGUNTA RESPOSTA Segunda Parte (7 valores) PERGUNTA 1.1 2.1 1.2 2.2.1 1.3 2.2.2 1.4

Leia mais

Padrões contexto problema solução

Padrões contexto problema solução Padrões Padrões são soluções para problemas específicos que ocorrem de forma recorrente em um determinado contexto que foram identificados a partir da experiência coletiva de desenvolvedores de software.

Leia mais

Arquitectura de Sistemas de Software

Arquitectura de Sistemas de Software Arquitectura de Sistemas de Software Ademar Aguiar www.fe.up.pt/~aaguiar ademar.aguiar@fe.up.pt Arquitectura de Sistemas de Software, LEIC/MEI, 2003/2004 1 Arquitectar... Arquitectar uma pequena cabana

Leia mais

Programação com Objectos

Programação com Objectos Programação com Objectos PADRÕES DE DESENHO Classificaçã Objectivo Criação Estrutura Comportamento Introdução Alguns Padrões de Desenho Classe Factory Method Adapter Interpreter Template Method O que é

Leia mais

INF011 Padrões de Projeto. 11 Composite

INF011 Padrões de Projeto. 11 Composite INF011 Padrões de Projeto 11 Composite Sandro Santos Andrade sandroandrade@ifba.edu.br Instituto Federal de Educação, Ciência e Tecnologia da Bahia Departamento de Tecnologia Eletro-Eletrônica Graduação

Leia mais

Paginador. Intenção. Motivação

Paginador. Intenção. Motivação Paginador Intenção Fornecer um mecanismo que permita o acesso a um conjunto de objetos por partes, definidas como páginas, mantendo o controle da navegação dos objetos na página corrente. Motivação Vamos

Leia mais

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS Departamento de Informática PUC-Rio Ivan Mathias Filho ivan@inf.puc-rio.br Programa Capítulo 17 Padrões de Design Singleton Facade Factory Method Observer Strategy

Leia mais

Decorator e Composite. Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator e Composite. Nazareno Andrade (baseado no material de Hyggo Almeida) Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida) Decorator Vocês sabem como ler um arquivo texto em Java??? Pode-se usar a classe java.io.fileinputstream Vamos fazer um teste

Leia mais

Design Patterns. Viviane Torres da Silva

Design Patterns. Viviane Torres da Silva Design Patterns Viviane Torres da Silva viviane.silva@ic.uff.br http://www.ic.uff.br/~viviane.silva/2010.1/es1 Sumário Reuso de Software Introdução Benefícios e Desvantagens Visão do Reuso Padrões de Projeto

Leia mais

Módulo I Princípios e Padrões de Projeto de SW em Java

Módulo I Princípios e Padrões de Projeto de SW em Java Módulo I Princípios e Padrões de Projeto de SW em Java Professores Eduardo Bezerra edubezerra@gmail.com Ismael H F Santos ismael@tecgraf.puc-rio.br April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

Leia mais

Padrão Comportamental: Paginador

Padrão Comportamental: Paginador Padrão Comportamental: Paginador Wellington Pinheiro Paulo Fernando Intenção Fornecer um mecanismo que permita o acesso a um conjunto de objetos por partes, definidas como páginas, mantendo o controle

Leia mais

Introdução. Conceitos Básicos. Conceitos Básicos. Conceitos Básicos

Introdução. Conceitos Básicos. Conceitos Básicos. Conceitos Básicos Introdução Laboratório de Computação para Ciências Módulo II Prof. Guilherme Tavares de Assis Universidade Federal de Ouro Preto UFOP Instituto de Ciências Exatas e Biológicas ICEB Mestrado Profissional

Leia mais

ALUNO: RONI FABIO BANASZEWSKI

ALUNO: RONI FABIO BANASZEWSKI Model-View-Controller ALUNO: RONI FABIO BANASZEWSKI Objetivo Separar dados ou lógica de negócios (Model) da interface do usuário (View) e do fluxo da aplicação (Control) A idéia é permitir que uma mesma

Leia mais

Introdução. descrever os tipos de interfaces e linguagens oferecidas por um SGBD. mostrar o ambiente de programas dos SGBD s

Introdução. descrever os tipos de interfaces e linguagens oferecidas por um SGBD. mostrar o ambiente de programas dos SGBD s Introdução Contribuição do Capítulo 2: discutir modelos de dados definir conceitos de esquemas e instâncias descrever os tipos de interfaces e linguagens oferecidas por um SGBD mostrar o ambiente de programas

Leia mais

Padrões GoF. Leonardo Gresta Paulino Murta leomurta@ic.uff.br

Padrões GoF. Leonardo Gresta Paulino Murta leomurta@ic.uff.br Padrões GoF Leonardo Gresta Paulino Murta leomurta@ic.uff.br Agenda Introdução Padrões de Criação Padrões de Estrutura Padrões de comportamento Leonardo Murta Padrões GoF 2 Introdução Os padrões GoF (Gamma

Leia mais

Composite. Pronunciação americana: compósit Pronunciação canadense (Britânica): cómposit

Composite. Pronunciação americana: compósit Pronunciação canadense (Britânica): cómposit Pronunciação Pronunciação americana: compósit Pronunciação canadense (Britânica): cómposit Um problema a resolver: editor de documentos Para introduzir este padrão (e alguns outros), usaremos o exemplo

Leia mais

Testes com Design Patterns

Testes com Design Patterns Helder da Rocha (helder.darocha@gmail.com) 31 de março de 2005 71. Que padrão de design pode ser usado para permitir que uma implementação específica e uma hierarquia de abstrações possa variar independentemente?

Leia mais

Soluções reutilizáveis para situações ou problemas encontrados comumente em desenvolvimento de software orientado a objetos.

Soluções reutilizáveis para situações ou problemas encontrados comumente em desenvolvimento de software orientado a objetos. Padrões de Projeto O que são? Soluções reutilizáveis para situações ou problemas encontrados comumente em desenvolvimento de software orientado a objetos. Livros Design Patterns: Elements of Reusable Object-

Leia mais

Prof.ª Esp. Talita Pagani

Prof.ª Esp. Talita Pagani Especialização em Engenharia de Software Prof.ª Esp. Talita Pagani talita.cpb@gmail.com @talitapagani 21/02/2014 Design Patterns Aula 1 Prof.ª Esp. Talita Pagani 1 Informações gerais 1. Definição de Design

Leia mais

15/09/2014. Aula 01: Apresentação. Review to 1 st Exam. Aula 02: Técnicas de Reuso. Panorama de Reuso. Aula 03: POO e Padrões. Bibliografia da Aula 02

15/09/2014. Aula 01: Apresentação. Review to 1 st Exam. Aula 02: Técnicas de Reuso. Panorama de Reuso. Aula 03: POO e Padrões. Bibliografia da Aula 02 Software Reuse Lecture 13 Aula 01: Apresentação Review to 1 st Exam Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo reuso.software@gmail.com 15 September 2014 Bibliografia Método de avaliação Provas

Leia mais

Padrões de Projeto. Prof. Jefersson Alex dos Santos (jefersson@dcc.ufmg.br) http://www.dcc.ufmg.br/~jefersson

Padrões de Projeto. Prof. Jefersson Alex dos Santos (jefersson@dcc.ufmg.br) http://www.dcc.ufmg.br/~jefersson Padrões de Projeto Prof. Jefersson Alex dos Santos (jefersson@dcc.ufmg.br) http://www.dcc.ufmg.br/~jefersson Apresentação Conceitos Definição Ponto de vista prático História Padrões de Projeto Conhecidos

Leia mais

Segunda Parte (3 valores) Primeira Parte (7 valores) Nome: Número: PERGUNTA NOTA PERGUNTA RESPOSTA

Segunda Parte (3 valores) Primeira Parte (7 valores) Nome: Número: PERGUNTA NOTA PERGUNTA RESPOSTA 2º Teste 2012/2013 1º Semestre 201301171830 1/7 2º Teste 2012/2013 1º Semestre 17 de Janeiro de 2013, 11:30 (120 minutos) Nome: Número: Primeira Parte (7 valores) PERGUNTA NOTA 1.1.1 1.1.2 1.1.3 1.2 1.3

Leia mais

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

Classes o Objetos. Classes, objetos, métodos e variáveis de instância Classes o Objetos Um recurso comum de cada aplicativo feito até agora é que todas as instruções que realizavam tarefas localizavam-se no método main. Se você tornar parte de uma equipe de desenvolvimento

Leia mais

Introdução. Conceitos Básicos. Conceitos Básicos. Conceitos Básicos

Introdução. Conceitos Básicos. Conceitos Básicos. Conceitos Básicos Conceitos Básicos Introdução Tópicos Especiais Modelagem de Dados Prof. Guilherme Tavares de Assis Universidade Federal de Ouro Preto UFOP Instituto de Ciências Exatas e Biológicas ICEB Mestrado Profissional

Leia mais

Creational Patterns Factory method

Creational Patterns Factory method Objetivo do Factory method é definir qual será a subclasse que utilizada um cliente. Permite que o sistema funcione sem o conhecimento prévio das subclasses. Assim um framework pode ser construído apenas

Leia mais

Etapas principais do desenvolvimento de software Padrões arquiteturais Padrões de projeto

Etapas principais do desenvolvimento de software Padrões arquiteturais Padrões de projeto Etapas principais do desenvolvimento de software Padrões arquiteturais Padrões de projeto 1 Criar aplicações não é apenas escrever código (code and fix) Atualmente as aplicações exigem arquiteturas e código

Leia mais

Tópicos Especiais em Informática Fatec Indaiatuba

Tópicos Especiais em Informática Fatec Indaiatuba Prof. Dr. Dilermando Piva Jr. Fatec Indaiatuba O que tem a ver isso com Programação? Imagine que uma pessoa tenha aprendido diversas técnicas de pintura. A partir desse conhecimento, ela saberá como pegar

Leia mais

Roni Fabio Banaszewski UTFPR Universidade Tecnológica Federal do Paraná

Roni Fabio Banaszewski UTFPR Universidade Tecnológica Federal do Paraná Roni Fabio Banaszewski UTFPR Universidade Tecnológica Federal do Paraná Reuso Motivações para reutilização de software Aspecto econômico Produtividade Time to market Qualidade Utilização de artefatos (código,

Leia mais

Curso - Padrões de Projeto Módulo 1: Introdução

Curso - Padrões de Projeto Módulo 1: Introdução Curso - Padrões de Projeto Módulo 1: Introdução Vítor E. Silva Souza vitorsouza@gmail.com http://www.javablogs.com.br/page/engenho http://esjug.dev.java.net Sobre o Instrutor Formação: Java: Graduação

Leia mais

INF011 Padrões de Projeto. 04 Builder

INF011 Padrões de Projeto. 04 Builder INF011 Padrões de Projeto 04 Builder Sandro Santos Andrade sandroandrade@ifba.edu.br Instituto Federal de Educação, Ciência e Tecnologia da Bahia Departamento de Tecnologia Eletro-Eletrônica Graduação

Leia mais

Aula 01: Apresentação. Revisão para Prova 1. Aula 02: Técnicas de Reuso. Panorama de Reuso. Aula 03: POO e Padrões. Bibliografia da Aula 02

Aula 01: Apresentação. Revisão para Prova 1. Aula 02: Técnicas de Reuso. Panorama de Reuso. Aula 03: POO e Padrões. Bibliografia da Aula 02 Reutilização de Software Aula 13 Aula 01: Apresentação Revisão para Prova 1 Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo reuso.software@gmail.com 23 Setembro 2013 Bibliografia Método de avaliação

Leia mais

Projeto de software Estrutura do software e arquitetura SWEBOK

Projeto de software Estrutura do software e arquitetura SWEBOK Projeto de software Estrutura do software e arquitetura SWEBOK SWEBOK Design Patterns Maneira testada ou documentada de alcançar um objetivo qualquer Padrões são comuns em várias áreas da engenharia Design

Leia mais

Prof. Dr. Dilermando Piva Jr. Fatec Indaiatuba

Prof. Dr. Dilermando Piva Jr. Fatec Indaiatuba Prof. Dr. Dilermando Piva Jr. Fatec Indaiatuba Imagine que uma pessoa tenha aprendido diversas técnicas de pintura. A partir desse conhecimento, ela saberá como pegar um pincel, como misturar as cores

Leia mais

Nome: Número: Segunda Parte (3 valores) Primeira Parte (7 valores)

Nome: Número: Segunda Parte (3 valores) Primeira Parte (7 valores) 2º Teste 2013/2014 1º Semestre 201401140900 2º Teste 2013/2014 1º Semestre 14 de Janeiro de 2014, 09:00 (120 minutos) Nome: Número: 1/8 Primeira Parte (7 valores) PERGUNTA NOTA 1.1.1 1.1.2 1.1.3 1.2.1

Leia mais

Programação Orientada a Objetos. Padrões Comportamentais

Programação Orientada a Objetos. Padrões Comportamentais Programação Orientada a Objetos Padrões Comportamentais Cristiano Lehrer, M.Sc. Classificação dos Padrões de Projeto Propósito o que o padrão faz: Padrões de criação: abstraem o processo de criação de

Leia mais

5 Arquitetura de implementação

5 Arquitetura de implementação Arquitetura de implementação 103 5 Arquitetura de implementação 5.1 Visão geral Nossa arquitetura é caracterizada pela construção de um ambiente para execução de aplicações hipermídia definidas segundo

Leia mais

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas Objetivo Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas Também chamado de Kit Resumo Parece semelhante ao padrão Factory Method,

Leia mais

Programação Avançada. Padrões de Projeto de Software. Fonte: Oswaldo B. Peres e K19 Treinamentos

Programação Avançada. Padrões de Projeto de Software. Fonte: Oswaldo B. Peres e K19 Treinamentos Programação Avançada Padrões de Projeto de Software 1 Fonte: Oswaldo B. Peres e K19 Treinamentos Introdução Projetar software OO reusável e de boa qualidade é uma tarefa difícil; Para realizar essa tarefa

Leia mais

Orientação a Objetos AULA 09

Orientação a Objetos AULA 09 Orientação a Objetos AULA 09 Prof. Fabrício Martins Mendonça Conteúdo da Aula ü Coleções ü Coleções lista de objetos ü Coleções conjuntos 2 Coleções Podemos armazenar vários objetos em um array e este

Leia mais

1Introdução Helder da Rocha (helder@acm.org)

1Introdução Helder da Rocha (helder@acm.org) J930 Padrões Projeto de 1Introdução Helder da Rocha (helder@acm.org) argonavis.com.br O que é um padrão? Maneira testada ou documentada de alcançar um objetivo qualquer Padrões são comuns em várias áreas

Leia mais

Banco de Dados. SGBD - Sistema de Gerenciamento de Banco de Dados Parte 2. Prof. Leonardo Vasconcelos

Banco de Dados. SGBD - Sistema de Gerenciamento de Banco de Dados Parte 2. Prof. Leonardo Vasconcelos Banco de Dados Parte 2 Prof. Leonardo Vasconcelos - Conceitos e Arquiteturas de SBD Modelos de dados: conjunto de conceitos que podem ser usados para descrever a estrutura de um banco de dados. Permitem

Leia mais

Interfaces e Classes Abstratas

Interfaces e Classes Abstratas Interfaces e Classes Abstratas José Gustavo de Souza Paiva Problema Método obterarea()? Classes Abstratas Classes que funcionam como um molde Declarada com comando abstract Contém um ou mais métodos abstratos

Leia mais

Abstract Factory Builder Factory Method Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy

Abstract Factory Builder Factory Method Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy Abstract Factory Builder Factory Method Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State

Leia mais

INTRODUÇÃO À TECNOLOGIA DA INFORMAÇÃO ACESSO, ATRIBUTOS E OPERAÇÕES COM ARQUIVOS PROFESSOR CARLOS MUNIZ

INTRODUÇÃO À TECNOLOGIA DA INFORMAÇÃO ACESSO, ATRIBUTOS E OPERAÇÕES COM ARQUIVOS PROFESSOR CARLOS MUNIZ INTRODUÇÃO À TECNOLOGIA DA OPERAÇÕES COM ARQUIVOS PROFESSOR CARLOS MUNIZ INTRODUÇÃO O Sistema de Arquivos é o modo como as informações são armazenadas nos dispositivos físicos de armazenamento, exemplo

Leia mais

Classe Abstrata e Interface

Classe Abstrata e Interface Orientação a objetos com Java Classe Abstrata e Interface Byron Leite byron.leite@gmail.com 1 Herança Agenda Geral Parte 04 Encapsulamento Pacotes Modificadores de Acesso private, default, protected, public

Leia mais

J930. Padrões. Projeto. Introdução. argonavis.com.br. Helder da Rocha (helder@acm.org)

J930. Padrões. Projeto. Introdução. argonavis.com.br. Helder da Rocha (helder@acm.org) Padrões de J930 Projeto Introdução Helder da Rocha (helder@acm.org) argonavis.com.br O que é um padrão? Maneira testada ou documentada de alcançar um objetivo qualquer Padrões são comuns em várias áreas

Leia mais

Definindo um padrão para arquitetura Web

Definindo um padrão para arquitetura Web Definindo um padrão para arquitetura Web Padrões de Projeto Soluções reutilizáveis para situações ou problemas encontrados comumente em desenvolvimento de software orientado a objetos. Livros Design Patterns:

Leia mais

SID - Sistema Interativo Distribuído

SID - Sistema Interativo Distribuído SID - Sistema Interativo Distribuído Proposta de projeto Sistemas de Objetos Distribuídos Prof.: Fabio Kon IME/USP Maio 2002 Aluno: OBJETIVOS DESTE DOCUMENTO...1 OBJETIVOS DO PROJETO...1 FUNCIONALIDADES

Leia mais

Princípios de Engenharia de Software Resumo 8 Semana 8 Versão: 1.0 Data: 05/10/04

Princípios de Engenharia de Software Resumo 8 Semana 8 Versão: 1.0 Data: 05/10/04 Alunos: Ariane Bueno 0114784-9 Elaine A. de Carvalho 0114633-1 Gabriel Ramos 0114838» O QUE APRENDI ASSUNTO: ARQUITETURA ASSUNTO: Notas de aula referentes às aulas de 30/09/04, Arquitetura de Software(Shaw),

Leia mais

Java para Desktop. Programação Orientada à Objetos 2 JSE

Java para Desktop. Programação Orientada à Objetos 2 JSE Java para Desktop Programação Orientada à Objetos 2 JSE Encapsulamento significa "ocultar informações, ele define que cada objeto contém todos os detalhes de implementação necessários sobre como ele funciona

Leia mais

O USO DOS PADRÕES DE PROJETO GOF NA ANÁLISE E DESENVOLVIMENTO DE SISTEMAS

O USO DOS PADRÕES DE PROJETO GOF NA ANÁLISE E DESENVOLVIMENTO DE SISTEMAS O USO DOS PADRÕES DE PROJETO GOF NA ANÁLISE E DESENVOLVIMENTO DE SISTEMAS Revista UNILUS Ensino e Pesquisa v. 13, n. 30, jan./mar. 2016 ISSN 2318-2083 (eletrônico) Claudio Costa Matos Graduando no curso

Leia mais

Agenda da Aula. Reuso de Software. Tipos de Reuso. Potenciais Problemas. Vantagens de Reuso. Introdução a Reuso de Software

Agenda da Aula. Reuso de Software. Tipos de Reuso. Potenciais Problemas. Vantagens de Reuso. Introdução a Reuso de Software Reuso de Software Aula 02 Agenda da Aula Introdução a Reuso de Software Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo reuso.software@gmail.com Introdução a Reuso de Software Abordagens de Reuso

Leia mais

Visões Arquiteturais. Visões Arquiteturais

Visões Arquiteturais. Visões Arquiteturais Visões Arquiteturais Separar diferentes aspectos em visões separadas com o objetivo de gerenciar complexidade. Cada visão descreve diferentes conceitos da Engenharia. Visões permitem reduzir a quantidade

Leia mais

5 Implementação 5.1 Plataforma 5.2 Arquitetura

5 Implementação 5.1 Plataforma 5.2 Arquitetura 5 Implementação Neste capítulo são apresentados os detalhes sobre a implementação da ferramenta. São discutidas as tecnologias envolvidas, assim como as limitações e problemas encontrados durante o desenvolvimento.

Leia mais

3 Arquitetura MVC baseada em modelos

3 Arquitetura MVC baseada em modelos Arquitetura MVC baseada em modelos 30 3 Arquitetura MVC baseada em modelos 3.1. Visão geral Na arquitetura proposta os componentes de Controle e Visão, da arquitetura tradicional do padrão de projetos

Leia mais

Daniel Wildt

Daniel Wildt Orientação a Objetos 1 Daniel Wildt http://danielwildt.blogspot.com Agenda 2 Orientação a Objetos Classe x Objeto Representação classe Atributos / operações Construtores e Destrutores Liberando memória

Leia mais

Structural Patterns - Bridge

Structural Patterns - Bridge Objetivo é separar a abstração da implementação, de tal forma que possibilidade um independência entre as duas. Caminho natural para uma abstração com diversas possibilidades de implementação é a herança.

Leia mais

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções Implementação de Genéricos, Iteradores Isabel Harb Manssour Porto Alegre, maio de 2006 Roteiro Implementação de Genéricos Coleções Conceito de Genérico Implementação Iteradores Conceito Utilização ForEach

Leia mais

Introdução a orientação a objetos

Introdução a orientação a objetos 2 Introdução a orientação a objetos Introdução 2 Linguagens procedimentais 2 Um pouco de história 2 Idéias básicas da POO 2 Classe, atributo e método 2 Herança 3 Polimorfismo 3 Vantagens e desvantagens

Leia mais

6 A Ferramenta de Medição e Avaliação

6 A Ferramenta de Medição e Avaliação 77 6 A Ferramenta de Medição e Avaliação Neste capítulo é apresentada a ferramenta AJATO, acrônimo para Ferramenta de Avaliação AspectJ 11. Esta ferramenta permite medir e avaliar sistemas implementados

Leia mais

5 QCDTool: Uma Ferramenta para Avaliar a Qualidade do Design em Modelos

5 QCDTool: Uma Ferramenta para Avaliar a Qualidade do Design em Modelos 5 QCDTool: Uma Ferramenta para Avaliar a Qualidade do Design em Modelos Este capítulo apresenta a ferramenta desenvolvida para apoiar a aplicação, em diagramas de classes, de mecanismos de análise da qualidade

Leia mais

Factory Pattern. SISMO - Sistemas e Mobilidade Junho de Departamento de Informática / UFMA

Factory Pattern. SISMO - Sistemas e Mobilidade  Junho de Departamento de Informática / UFMA Factory Pattern SISMO - Sistemas e Mobilidade http://www.sismo.deinf.ufma.br Departamento de Informática / UFMA Junho de 2008 Do que vamos tratar? Criação de objetos não é simplesmente usar o operador

Leia mais

Padrões de Arquitetura de Software. Leandro Tonietto Unisinos fev-09

Padrões de Arquitetura de Software. Leandro Tonietto  Unisinos fev-09 Padrões de Arquitetura de Software Leandro Tonietto ltonietto@unisinos.br http://www.inf.unisinos.br/~ltonietto Unisinos fev-09 Introdução Padrões de projeto de software descrevem a criação, estruturação

Leia mais

Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI CCO002 Engenharia de Software

Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI CCO002 Engenharia de Software UNIFEI Disciplina Professor Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI CCO002 Engenharia de Software Enzo Seraphim 1 Padrões de Construção A maneira

Leia mais

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos Programação Orientada a Objetos Vagner Luz do Carmo - Vluzrmos Questão 1 Dada a seguinte classe na linguagem JAVA: public class Carro { public String retornacor(){ ; return Azul ; private String retornachassi(){

Leia mais

Universidade Federal da Paraíba CCEN Departamento de Informática Disciplina: Banco de Dados. Aula 1 Introdução a Banco de Dados

Universidade Federal da Paraíba CCEN Departamento de Informática Disciplina: Banco de Dados. Aula 1 Introdução a Banco de Dados Universidade Federal da Paraíba CCEN Departamento de Informática Disciplina: Banco de Dados Aula 1 Introdução a Banco de Dados 1. Introdução Um Sistema Gerenciador de Banco de Dados (SGBD) é constituído

Leia mais

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Introdução geovanegriesang@unisc.br Processadores de linguagem Linguagens de programação são notações para se descrever

Leia mais

Design Pattern Implementation in Java and AspectJ

Design Pattern Implementation in Java and AspectJ Design Pattern Implementation in Java and AspectJ Jan Hannemann Gregor Kiczales In Proceedings of 2002 ACM SIGPLAN conference on OOPSLA. NY, USA. Introdução 2 Introdução 3 Introdução 4 Introdução 5 Introdução

Leia mais

Modelagem de Dados MODELAGEM DE DADOS. Sistemas de Banco de Dados. Profa. Rosemary Melo

Modelagem de Dados MODELAGEM DE DADOS. Sistemas de Banco de Dados. Profa. Rosemary Melo MODELAGEM DE DADOS Sistemas de Banco de Dados Profa. Rosemary Melo SISTEMAS DE BANCO DE DADOS OBJETIVOS Apresentar os conceitos fundamentais de Sistemas de Banco de Dados. Principais componentes dos SGBDs

Leia mais

Banco de Dados. SGBD - Sistema de Gerenciamento de Banco de Dados Parte 1. Prof. Leonardo Vasconcelos

Banco de Dados. SGBD - Sistema de Gerenciamento de Banco de Dados Parte 1. Prof. Leonardo Vasconcelos Banco de Dados SGBD - Sistema de Gerenciamento de Banco de Dados Parte 1 Prof. Leonardo Vasconcelos - O que é um banco de dados (BD)? Um Banco de Dados (ou Base de Dados) é uma coleção de dados relacionados,

Leia mais