Padrões de Projeto: Reuso, Observer e Padrões Estruturais
Classificado em Computação
Escrito em em
português com um tamanho de 5,87 KB
1. Por que os Padrões são uma maneira efetiva de Reuso de Projeto? Quais são as desvantagens dessa abordagem?
Padrões são soluções para problemas específicos que ocorrem de forma recorrente em um determinado contexto, identificados a partir da experiência coletiva de desenvolvedores de software.
Vantagens do Uso de Padrões de Projeto
A principal vantagem do uso dos padrões é que eles descrevem abstrações de software, contendo:
- Vocabulário comum: Facilita a comunicação entre desenvolvedores.
- Comunicação efetiva de princípios complexos.
- Ajuda a documentar a arquitetura do software.
- Captura as partes essenciais do design de forma compacta.
Desvantagens e Cuidados Necessários
Entretanto, o uso de Padrões de Projeto não apresenta uma solução exata e não resolve todos os problemas de design. É importante ressaltar que Padrões de Projeto não são exclusivos de design orientado a objetos.
Com a reutilização de algo já pronto, tem-se a falsa ideia de que um padrão é a solução completa para qualquer problema, quando, de fato, é uma proposta de solução, implementada e testada em algum cenário específico. Tal cenário nem sempre coincide com aquele em que se está construindo a solução. Assim, alguns cuidados são necessários:
- O uso de padrões de uma maneira descontrolada pode originar projetos sobrecarregados.
- Os desenvolvedores precisam de tempo para entender os catálogos de padrões relevantes.
- É necessário ter fácil acesso a catálogos relevantes e ser treinado no uso de padrões.
2. Padrão de Projeto Observer
Descreva com suas palavras qual o problema que o padrão de projeto Observer resolve e modele em classes UML o padrão Observer usando um exemplo.
O Problema que o Observer Resolve
O padrão Observer (Observador) resolve o problema de manter a consistência entre objetos que dependem do estado de outro objeto, sem que o objeto principal (o Sujeito) precise conhecer a identidade específica de seus dependentes (os Observadores).
O padrão Observer possui as seguintes tarefas:
- Permite que objetos registrem dinamicamente suas dependências de outros objetos.
- Um objeto especial (o Sujeito) notificará os objetos dependentes (os Observadores) sempre que o seu estado sofrer alteração.
- Permite atualizar um conjunto de objetos quando um certo objeto sofrer modificação.
A solução estrutural em classes é:
Alguns exemplos do Observer:
3. Descrição de Padrões de Projeto (Objetivo, Usos e Implementação UML)
Padrão Proxy
Segundo GoF: "Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro."
Usos e Implementação:
- O Cliente usa uma classe intermediária em vez do sujeito real.
- A classe Intermediária suporta a mesma interface que o sujeito real.
- O Intermediário contém uma referência para o sujeito real e repassa chamadas, possivelmente, acrescentando informações ou filtrando dados no processo.
O padrão Proxy é muito utilizado em objetos distribuídos.
Padrão Flyweight
Segundo GoF: "Usar compartilhamento para suportar grandes quantidades de objetos refinados eficientemente."
Deve ser utilizado:
- Quando o tamanho do conjunto de objetos for significativamente menor que a quantidade de vezes em que eles são usados na aplicação.
- Quando objetos podem ser usados em diferentes contextos ao mesmo tempo (agindo sempre como um objeto independente).
Quando não usar:
- Quando o estado dos objetos não for imutável (é preciso passar o estado mutável como parâmetro, e isto pode ser impraticável se o estado consistir de vários objetos).
- Quando for necessário elaborar um algoritmo ou algo complicado para separar objetos mutáveis de imutáveis.
Padrão Bridge
Segundo GoF: "Desacoplar uma abstração de sua implementação para que os dois possam variar independentemente."
Utilizar quando:
- For necessário evitar uma ligação permanente entre a interface e a implementação.
- Alterações na implementação não puderem afetar clientes.
- Tanto abstrações como implementações precisarem ser capazes de suportar extensão através de herança.
- Implementações são compartilhadas entre objetos desconhecidos do cliente.
Padrão Factory Method
Permite que uma classe genérica (escrita para ser reusada) instancie outras classes sem que seja dependente de tais classes, isto é, sem que faça menção explícita a essas.
A classe genérica se mantém independente das classes que instancia através da delegação para um outro objeto da escolha de qual classe instanciar e somente se refere ao objeto então criado através de uma interface comum. Permite criar objetos desejados utilizando métodos que retornam os objetos.
4. Exemplo de Implementação do Padrão Builder
Uma aplicação precisa construir objetos Pessoa e Empresa. Para isto, precisa ler dados de um banco para cada produto. (Utilize Builder).
Requisitos de Construção
- Para construir uma Pessoa: É preciso obter nome e identidade. Apenas se os dois forem lidos a pessoa pode ser criada.
- Para construir uma Empresa: É preciso ler o nome e identidade do responsável e depois construir a pessoa do responsável.
Mostre como poderia ser implementada uma aplicação que realizasse as tarefas acima.