Padrões GoF
Jobson Ronan {[email protected]}
Padrões Estruturais

Tratam de compor classes e objetos para formar estruturas
grandes e complexas
Padrão Adapter (Wrapper)
Padrão Adapter

Intenção


Também conhecido como


Converter a interface de uma classe em outra interface, esperada
pelos clientes. Permite que classes com interfaces incompatíveis
trabalhem em conjunto.
Wrapper
Motivação


Algumas vezes uma classe (de um toolkit) não é reusável porque
sua interface não é compatível com a interface de uma aplicação
de um domínio específico.
A solução é criar um objeto adaptador, que encapsule e filtre as
especificidades da classe adaptada, fornecendo uma interface
que a aplicação espera utilizar
Padrão (Class)Adapter

Estrutura e Participantes

Usando Herança Múltipla
Padrão (Class)Adapter

Estrutura e Participantes

Usando Composição
Padrão Adapter

Aplicabilidade

Use o Padrão Adapter quando:



Você quer usar uma classe existente, e sua interface não é compatível com
uma que você necessita
Você quer criar uma classe reusável que coopera com classes nãorelacionadas ou não previstas a priori, isto é, classes que não apresentam
necessariamente interfaces compatíveis
(Somente para ObjectAdapter) Você precisa usar várias subclasses
existentes (de Adaptee), mas é impraticável adaptar as interfaces de cada
uma através de herança. Um ObjectAdapter pode resolver isto adaptando
abstratamente a interface da superclasse.
Padrão Adapter

Conseqüências

ClassAdapter



Adapta uma classe concreta, mas NÃO SUAS SUBCLASSES
Pode sobrepor alguns comportamentos do adaptado, visto que é uma
subclasse da classe adaptada
ObjectAdapter



Permite que um único Adapter trabalhe com muitos adaptados. Ou seja, o
próprio Adaptee e suas subclasses.
Pode adicionar funcionalidade extra a todos os adaptados de uma só vez.
Dificulta a sobreposição do comportamento do adaptado.
Padrão Bridge(Handle, Body)
Padrão Bridge

Intenção


Também conhecido como


Desacoplar uma abstração de sua implementação, de modo que
as duas possam variar independentemente.
Handle/Body
Motivação



Quando uma abstração pode ter várias implementações a solução
usual é acomodar todas as implementações através de herança
No entanto, herança liga de forma permanente uma abstração a
uma implementação
O padrão Bridge permite colocar as abstrações e suas
implementações em diferentes hierarquias de classes, e permite
que variem de forma independente
Padrão Bridge

Estrutura e Participantes
Padrão Bridge

Aplicabilidade

Use o Padrão Bridge Quando:



Você quer evitar ligação permanente entre uma abstração e sua
implementação. Pode ser, por exemplo, quando se deseja variar a
implementação em run-time
Tanto a abstração quanto a implementação devem ser extensíveis através
de herança
Mudanças na implementação de uma abstração não devem ter impacto
sobre o cliente
Padrão Bridge

Conseqüências

Desacoplamento entre interface e implementação Implementação
de uma abstração configurada em run-time



Extensibilidade incrementada


Eliminação de dependências de compilação
Criação de camadas de abstração que podem melhor estruturar o sistema
Herança para abstração e implementação
Detalhes de implementação são escondidos do cliente
Padrão Decorator
Padrão Decorator

Intenção


Anexa dinamicamente responsabilidades adicionais a um objeto. Provê uma
alternativa flexível ao uso de herança como modo de estender funcionalidade.
Motivação



Algumas vezes se quer adicionar responsabilidades a um objeto, mas não à
sua classe. Acontece, por exemplo, com a criação de interfaces gráficas,
quando se deseja acrescentar uma borda a um componente qualquer ou um
scrollbar a uma área de texto.
Uma forma de se acrescentar responsabilidades é através de herança, mas isto
torna o projeto inflexível, pois a escolha da borda é definida em tempo de
compilação. Neste caso o cliente não pode controlar como, onde e quando
decorar o componente com uma borda.
Uma abordagem mais flexível é inserir o componente em outro objeto que
adiciona a borda, um Decorator.
Padrão Decorator

Estrutura e Participantes
Padrão Decorator

Aplicabilidade

Use o padrão Decorator:




Para adicionar responsabilidades a objetos individuais de forma dinâmica e
transparente, sem afetar outros objetos
Para responsabilidades que podem ser removidas
Quando extensão através de herança é impraticável. Algumas vezes uma
grande quantidade de extensões independentes são possíveis e seria
necessário um imenso número de subclasses para suportar cada
combinação possível entre elas.
Conseqüências


Mais flexibilidade que herança
Evita incorporação forçada de comportamentos desnecessários
Proxy
Padrão Proxy

Intenção


Prover um representante para outro objeto de modo a controlar o
acesso a este
Motivação

Várias razões para controlar acesso a um objeto, como por
exemplo:



deferir o custo de criação e inicialização para o momento de uso (objetos
sob demanda);
Prover um representante local para um objeto remoto;
Proteger o objeto original.
Padrão Proxy
Padrão Proxy

Aplicabilidade


O Padrão Proxy é usado sempre que se precisa de uma
referência a um objeto, que seja mais versátil ou sofisticada do
que um simples ponteiro.
As principais situações são




Remote Proxy - provê um representate local para um objeto em um espaço
de endereçamento diferente
Virtual Proxy - cria objeto sob demanda
Protection Proxy - controla acesso ao objeto original
Smart References - executa operações adicionais quando o objeto é
acessado


Contagem de referências, carga de objetos persistentes, locks
Copy-on-write - compartilhar grandes objetos, fazendo uma cópia apenas
se necessário
Padrão Proxy

Conseqüências

Acrescenta um nível de indireção adicional
Padrões GoF
Jobson Ronan {[email protected]}
Download

pec-12-patterns