Buscar

2 - Padrões de Interface

Prévia do material em texto

15/03/2010
1
Padrões de Projeto
Carga Horária 67hs
Padrões de Interface
Prof. Giuseppe Anthony N. Lima
giuseppeanl@gmail.com
Instituto Federal de Educação Tecnológica da Paraíba
CST – Sistemas para Internet
Introdução
• Padrões de Interface
– Endereçam contextos nos quais é preciso definir 
ou redefinir o acesso aos métodos de uma classe 
ou de um grupo de classes
• Interface
– Fôrma para serviços (métodos) de classes 
implementadoras
– Determina o uso ou acesso a uma classe qualquer 
a partir dos serviços (métodos) que estão 
disponíveis publicamente.
Introdução
• Uma interface pode ser implementada por 
diferentes classes!
• Uma classe pode implementar diversas 
interfaces!
• Padrões de Projeto e uso de Interfaces
– Uso do polimorfismo como forma de liberar a 
classe de um tipo específico de comportamento
Introdução
• Padrões de Interface
– Adapter
• Adapta a interface de uma classe para corresponder a 
interface esperada pelo cliente
– Façade
• Fornece uma interface simples para um conjunto de classes
– Bridge
• Define uma abstração para que componentes que se 
intercomunicam, que variam de implementação, possam se 
comunicar independentemente disso.
– Composite
• Define uma interface que se aplique a objetos individuais e 
aos grupos de objetos 
• Padrões de Interface
– Abordagem: Como acessar uma classe ou um 
conjunto de classes adequadamente.
Introdução
Essa interface é confusa, 
ainda não entendi como 
utilizar esse componente de 
software!
Adapter
• Converter a interface de uma classe em outra 
interface esperada pelos clientes. Permite a 
comunicação entre classes que não poderiam 
trabalhar juntas devido à incompatibilidade de 
suas interfaces [GoF]
15/03/2010
2
Adapter
• Motivação
– Precisamos implementar uma classe a fim de 
atender a uma demanda de uma outra
– No entanto descobrimos que existe a classe que 
fornece os serviços esperados possui uma 
interface diferente!
Adapter
Adapter
• Representação
Adapter
• Calculadora Simplificada
– Em uma determinada aplicação precisamos de 
uma classe que faça operações aritméticas
– Temos uma API que contém uma classe que faz 
isso!
– Nossa aplicação foi projetada para usar uma certa 
interface e a da API é diferente
– Não podemos mexer no código da API ou da 
aplicação!
Adapter
• Representação 
A classe da API existente possui 
uma interface incompatível com 
a de nosso cliente: veja os 
parâmetros!
Adapter
15/03/2010
3
Adapter Adapter
• O Adapter que vimos até agora é um Object 
Adapter:
– Adaptação é realizada com referência ao objeto a 
ser adaptado na classe adaptadora
– Delega responsabilidade de conversão
• Pequeno bloco de código para delegar ao objeto 
adaptado (cuja interface é incompatível com a do 
cliente)
Adapter
• Object Adapter
– Utiliza composição entre a classe adaptadora e a 
adaptada
Adapter
• Class Adapter
– Utiliza Herança
– O alvo tem que ser a classe utilizada pelo cliente
– A classe Adapter (Adaptador) estende Classe Existente 
(Adaptado) e irá implementar a interface Alvo.
Adapter
• Class Adapter Código
Adapter
• Class Adapter Código
15/03/2010
4
Adapter
• Object Adapter (Conseqüências)
– Permite substituição de comportamentos
– Permite introduzir um ou mais objetos
– Permite usar a hierarquia do objeto incompatível
• Se a classe existente possuir subclasses a adaptação 
funcionará do mesmo jeito
• A referência através de composição no Adaptador, para 
o Adaptado com subclasses garante o funcionamento 
de suas especializações.
Adapter
• Class Adapter (Conseqüências)
– Permite a substituição de comportamentos
• Através de sobrescrita de métodos possível na herança 
com o adaptado
– Adapta somente um objeto existente
• Devido a herança com o adaptado
– Economia de código
• Código do adaptado pode ser herdado ou estendido ( 
sobrescrito)
Adapter Façade
• “Fornecer uma interface unificada para um 
conjunto de classes em um subsistema [GoF]
• Define uma interface de nível mais alto que 
torna o subsistema mais fácil de ser usado 
[GoF]
Façade
• Quanto mais um sistema que é composto por 
diversos outros módulos ou subsistemas, o 
mesmo, se torna difícil de ser utilizado.
Façade
• Como definir uma interface de acesso que 
oculte a relação entre esses subsistemas?
15/03/2010
5
Façade
• Aplicabilidade
– Desejar oferecer uma interface simples para um 
sistema complexo
– Existirem muitas dependências entre os clientes e 
as classes de implementação de uma abstração 
– Desejar estruturar subsistemas em camadas
Façade
• Estrutura
Façade
• Exemplo
– Home-theater
• Dvd player
• Amplificador
• Projetor
• Tela
• Turner
• Etc.
Façade
• Como faríamos para montar o nosso Sistema 
de Home Theater?
– Selecionar os equipamentos necessários
– Dispor os equipamentos selecionados em seus 
lugares pelo ambiente
– Ligar os fios entre os equipamentos quando 
necessário
Façade Façade
15/03/2010
6
Façade
• Utilizando a biblioteca home-theater
Façade
public class Cliente{
...
pipoqueira.ligar();
pipoqueira.fazerPipoca();
tela.baixar();
projetor.ligar();
projetor.setInput(dvd);
projetor.widescreenMode();
amp.ligar();
amp.setDvd(dvd);
amp.setSorroundSound();
amp.setVolume(5);
dvd.ligar();
dvd.play(filme);
...
}
Façade
• Problemas
– O cliente tem que lidar com muitas classes
• Muitas associações
– O cliente tem que conhecer a interface de cada 
uma das classes
• Acoplamento está alto
– Manutenção está prejudicada
Façade
• Solução
Façade Façade
15/03/2010
7
Façade Façade
Façade Façade
• Não encapsula as classes do subsistema.
– Apenas fornece uma interface simplificada à sua 
funcionalidade
– Se alguma classe precisar acessar diretamente a 
funcionalidade, isso ainda poderá ser feito
• Isola os clientes dos subsistemas
– Reduz o número de objetos que os clientes têm de 
lidar 
– Torna o subsistema mais fácil de usar
Façade
• Mais de uma Façade para um mesmo 
subsistema
Façade
• Façade para uma única classe
15/03/2010
8
Façade
• O Padrão Façade encapsula as classes do 
subsistema?
• A Façade pode ser inteligente no sentido de 
que pode adicionar novas funcionalidades ao 
sistema?
Composite
• “Compor objetos em estruturas de árvore 
para compor hierarquias parte-todo”
• “Atribuir um comportamento uniforme a 
objetos primitivos ou compostos”
Composite
• Exemplos de Composições 
– Menus e Submenus são compostos por MenuItem
– Uma peça pode ser composta por outras peças 
mais básicas
– Em um editor de desenho uma figura pode ser 
composta por outras figuras elementares
• Exemplos de Composições 
Composite
• Exemplos de Composições 
Composite
getName();
getDescription();
getAction();
resize();
move();
bringToFront();
sendToBack();
girar();
parar();
Composite
• Composições
– Estrutura hierárquica 
• acesso parte-todo
– Comportamento uniforme
• Os objetos compostos e seus componentes 
“compartilham” comportamentos
15/03/2010
9
Composite
• Um composite representa um grupo de objetos no qual 
alguns deles podem conter outros objetos
– Se pode conter (composite, nó pai)
– Se não pode conter (component, nó ou folha)
Menu
Item de 
menu
Item de 
Menu
FiguraComposta
Círculo Triângulo
Figura 
Composta
Quadrado Losango
Composite
• Modelagem
– Projetar estruturas que possam conter itens 
individuais
– Definir comportamentos comuns para objetos 
componentes e compostos
Composite
• Exemplo
– Uma pequena fábrica que está começando a 
operar contémapenas uma máquina
Composite
Composite
• A fábrica cresceu e novas máquinas foram 
adquiridas...
• Novo cenário
– Máquinas devem ser organizadas em baias
– Cada máquina tem seu responsável
– Cada baia tem seu responsável
– Queremos operar e monitorar as baias e suas 
máquinas remotamente
– Quando a máquina não tiver responsável o 
encarregado da baia assume
Composite
• Fábrica
15/03/2010
10
Composite
• Implementação
– Operações se aplicam tanto as baias quanto as 
máquinas
• ligar(), verEstado(), getResponsavel()
– Lidamos com máquinas e baias em momentos 
diferentes (também!)
– A linha de produção será dotada de uma baia que 
pode conter outras máquinas.
Composite
• Solução
Composite
• A fábrica com Composite
Composite
• Código da Solução
Composite
• Código da Solução
Composite
• Código da Solução
15/03/2010
11
Composite
• Código da Solução
Composite
• Código da Solução
Composite
• Código da Solução (Cliente)
Composite
• Código da Solução (Cliente)
Composite
• Problema...
– O que fazer com os métodos específicos da classe 
composta baia
• Métodos não suportados por componente máquina ou 
exclusivos de baia
– getMaquina(), addMaquina(); removeItem(); procuraItem()
– Alguns comportamentos são similares
• Como prover uma implementação genérica para 
comportamentos comuns do composto e seus 
componentes
– getResp(); setResp();getID(); setID(); setEstado(), getEstado()
Composite
• Solução
– A interface componente passará a ser uma classe 
abstrata
• Métodos não suportados 
– Passam a ter uma implementação genérica na classe abstrata
– Devem conter a especificação de que podem não ser 
suportados: NotSupportedException, ou retornar nulo, etc.
• Métodos comuns
– Possuirão uma implementação genérica na classe abstrata
– Código da classe abstrata é reaproveitado nas subclasses ou 
pode ser adaptado. 
15/03/2010
12
Composite
• Solução
Classe abstrata Métodos não suportados
Composite
• Solução (Componente e Composto)
Composite
• Conseqüências
– Positivas
• Objetos complexos podem ser compostos de objetos 
mais simples recursivamente
– O cliente pode tratar objetos simples ou compostos da mesma 
forma: simplifica o cliente
• Facilita a adição de novos componentes
– O cliente não tem que mudar com a adição de novos objetos 
(simples ou compostos)
– Exemplo: novos componentes poderiam ser adicionados a 
fábrica, como esteiras, empacotadoras, etc. 
Composite
• Conseqüências (Cont.)
– Negativas: o projeto fica geral demais
• É mais difícil restringir os componentes de um objeto 
composto
• Por exemplo, podemos compor esteiras (objeto 
composto de produtos) com baias , o que não faz 
sentido, exceto o contrário
• O sistema de tipagem da linguagem não ajuda a 
detectar composições erradas
– A solução é verificar em tempo de execução
Composite
• Considerações
– Referencias aos filhos e métodos de gerência dos 
filhos
• Em Composite (Compositora)
– Uso seguro pelo cliente
– Adicionar um filho a uma folha não é permitido!
– Cliente deverá utilizar instanceof para acessar métodos de 
gerência (add(), remove(), etc.)
• Em Component (Componente)
– Uso transparente pelo cliente
– Todas as classes folha herdarão o código de gerência e a 
referência aos filhos: adicionar um filho a uma folha possível!
– Referência aos filhos pode ser inutilizada (desperdício de 
espaço em caso de ser um componente folha básico.
Composite
• Considerações (Cont.)
– Referências explicita ao pai
• Facilita o caminho sobre a estrutura (volta)
• Geralmente é colocada na classe Component
– Ordenação de Filhos é possível
• Iterator
– Qual a melhor estrutura de dados
• Qualquer coleção! (List, HashMap)
15/03/2010
13
Bridge
• Intenção
– “Desacoplar uma abstração de sua 
implementação de modo que as duas possam 
variar independentemente.”
• Motivação
– A herança liga uma implementação à abstração 
permanentemente, o que torna difícil modificar, 
aumentar e reutilizar abstrações e 
implementações independentemente.
Bridge
• Solução
– Separar as duas partes através de uma classe que 
intermedia a troca de mensagens
• Classe utiliza métodos cuja finalidade está implícita nos 
seus nomes, mas cuja implementação pode variar e 
cabe às classes concretas
– Podemos mudar a implementação sem afetar a 
abstração e vice-versa.
Bridge
• Solução
Bridge
• Abstração?
– Classe que depende de um conjunto de operações 
abstratas, onde diversas implementações desse 
conjunto são possíveis
• Implementação?
– Classe que implementa de forma específica uma 
interface esperada pela Abstração
Bridge
• Abstração X Implementação
– Uma pessoa X Homem, Mulher, etc.
– Uma figura X Quadrado, Triângulo, Círculo
– Uma máquina X Empacotadora, Engarrafadora
Bridge
• Temos uma aplicação que em princípio se 
utiliza de máquinas para funcionar:
– Máquina engarrafadora
– Máquina rotuladora
15/03/2010
14
Bridge
• Agora nosso projeto mudou...
– Existe um novo tipo de máquina: de teste
– Desejo que as outras máquina possuam uma 
versão de teste!
Bridge
• Nosso projeto mudou 
novamente...
– Agora tenho novos dois 
tipos de máquina: as 
máquinas grandes e as 
pequenas
– As máquinas existentes 
devem possuir ambas 
as características: 
grande ou pequena
Bridge
• Muita Herança?
– A abstração não está separada da implementação
– Ao utilizar um novo tipo o cliente deverá estar 
ciente disso (projeto inflexível)
• Ainda...
– A implementação deve variar em tempo de 
execução
Bridge
• Solução
Bridge
• Solução para a nossa aplicação...
Bridge
15/03/2010
15
Bridge
• Drivers
Bridge
• JDBC
Bridge
• Considerações
– 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
– A proliferação de classes dividindo o objeto em duas 
partes é evitada
– Você que compartilhar uma implementação entre 
múltiplos objetos e este fato deve ser escondido do 
cliente.

Outros materiais