Padrões de Projetos

Propaganda
Padrões de Projeto
Aula 9 – Padrão Adapter
PADRÃO ADAPTER
Padrões de Projeto - Adapter
Soluções simples para problemas reais!
Padrões de Projeto - Adapter
O que fazer?
1. Trocar a tomada  será que vale apena quebrar a parede?
2. Comprar um novo carregador no padrão europeu  Não deve ser barato...
3. Comprar um adaptador!  #seemslegit
• Situação: sua empresa compra uma biblioteca “X” que você
precisará usar no seu sistema. Mas, as interfaces não são
compatíveis... O que fazer?
• Nota 1: a biblioteca “X” vêm compilada;
• Nota 2: você deseja evitar alterações no código do sistema;
• Adiciona um adaptador entre elas.
• Torna as interfaces compatíveis e respeita o princípio abertofechado.
Padrões de Projeto - Adapter
Adaptadores e OO
Padrões de Projeto - Adapter
O que é um adaptador?
• Um instrumento que transforma uma interface em outra.
• Em outras palavras, permite que dois ou mais componentes de
software troquem informação mesmo com interfaces
incompatíveis.
O padrão Adapter converte a interface de uma
classe para outra interface que o cliente
espera encontrar. O Adaptador permite que
classes com interfaces incompatíveis
trabalhem juntas.
Padrões de Projeto - Adapter
Definição
Terminologia e Estrutura –
Object Adapter
Padrões de Projeto - Adapter
O adaptador (Adapter) implementa a
interface alvo (Target).
O cliente (Client) vê apenas a
interface alvo (Target).
O adaptador (Adapter)
composto com o Adaptado.
é
Todas as requisições são
delegadas aos adaptados
(Adaptee).
Prática
• Crie uma interface chamada “TomadaDeDoisPinosIF”, que possui um
método void conectar(ConectorDeDoisPinos conector);
• Agora crie uma interface chamada “TomadaDeTrêsPinosIF”, que possui
um método void conectar(ConectorDeTresPinos conector);
• Crie também uma classe “ConectorDeTresPinos“, que possui uma variável
protegida String descricao e um método público getDescricao().
• Crie uma classe chamada TomadaDeTresPinos que implementa
TomadaDeTresPinosIF
• Finalmente, crie as classes CarregadorNovo (herda de conector de 3
pinos) e CarregadorAntigo (herda de conector de 2 pinos)
• Tarefinha 
• No main, crie um carregador antigo e o conecte em uma tomada de 2 pinos;
• No main, crie um carregador novo e o conecte em uma tomada de 2 pinos
(sem alterar o código existente).
Padrões de Projeto - Adapter
• Crie uma classe “ConectorDeDoisPinos“, que possui uma variável protegida
String descricao e um método público getDescricao();
• Crie uma classe chamada TomadaDeDoisPinos que implementa
TomadaDeDoisPinosIF
Exemplos de Adapters
• JSDK API: Tratamento de eventos (java.awt.event)
• MouseAdapter, WindowAdapter, etc. são stubs para
implementação de adapters
• Double, Integer, Character, etc. "Adaptam" tipos primitivos à
interface de java.lang.Object.
• Uso de JTable, JTree, JList (javax.swing)
• A interface TableModel e as classes AbstractTableModel e
DefaultTableModel oferecem uma interface para o acesso aos
campos de uma Jtable
• Um adapter é útil para traduzir operações específicas do domínio
dos dados (planilha, banco de dados, etc.) às operações da
tabela.
Padrões de Projeto - Adapter
• JSDK API: Wrappers de tipos em Java
Padrões de Projeto - Adapter
Terminologia e Estrutura –
Class Adapter
O class adapter é implementado com herança múltipla.
A “herança múltipla pura”, A extends B,C,D não é suportada em java.
Mas uma classe pode herdar de uma classe e implementar várias classes, uma
maneira peculiar que uma classe pode usar para ser “filha” de várias outras.
Exercício I
Padrões de Projeto - Adapter
• Refaça o adaptador que fizemos em sala utilizando o modelo
“Class Adapter”. É simples! 
Exercício II
• “Compra” é composto por um objeto do tipo IPagamento
Padrões de Projeto - Adapter
• Considere o seguinte contexto: você é o desenvolvedor que programou o
sistema de um restaurante.
• O seu sistema lida com a parte de pagamentos, mas a princípio você
considerou apenas 2 bandeiras de cartão: Visa e Master. A estrutura UML do
módulo de pagamentos é especificada abaixo:
• Porém, a loja decide que vai ter mais um tipo de cartão de crédito, terá o
“American”. Logo, você pensa: “Tudo bem, é só eu herdar de
CartaodeCredito, implementar a forma específica de pagar e pronto! “.
• Mas... a empresa AmericanExpress já te forneceu uma lib pré-compilada
(não pode ser alterada) e você não deveria mudar sua classe
CartãoDeCrédito para evitar refazer os testes unitários e também evitar
efeitos colaterais. Veja a estrutura da lib abaixo.
Padrões de Projeto - Adapter
Exercício II
• E agora? A minha linguagem não permite herança múltipla! O que fazer?
• Com o padrão Adapter, é possível fazer essa implementação, e de forma
simples, sem ter que mudar o código do cliente (AmericanExpress) e nem o
do sistema de pagamentos do restaurante.
• P.s.: preencha os métodos pagar com prints que exibam a bandeira do
cartão.
1. Desenha a estrutura UML do projeto com o Adapter resolvendo o
problema.
2. Implemente a solução.
Padrões de Projeto - Adapter
Exercício II
Referências
Padrões de Projeto - Adapter
• [1] Capítulo 7 do livro “Padrões de Projeto – Use a Cabeça!”
Download