padrões de projeto aula 9 – padrão adapter. padrÃo adapter padrões de projeto - adapter...
TRANSCRIPT
Padrões de ProjetoAula 9 – Padrão Adapter
Padr
ões d
e Pr
ojet
o - A
dapt
er
PADRÃO ADAPTER
Soluções simples para problemas reais!
Padr
ões d
e Pr
ojet
o - A
dapt
er
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
Padr
ões d
e Pr
ojet
o - A
dapt
er
Adaptadores e OO
• 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 aberto-
fechado.
Padr
ões d
e Pr
ojet
o - A
dapt
er
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.
Padr
ões d
e Pr
ojet
o - A
dapt
er
Definição
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 d
e Pr
ojet
o - A
dapt
er
Terminologia e Estrutura – Object Adapter
O cliente (Client) vê apenas a interface alvo (Target).
O adaptador (Adapter) é composto com o Adaptado.
O adaptador (Adapter) implementa a interface alvo (Target).
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);• 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
• 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 d
e Pr
ojet
o - A
dapt
er
Padr
ões d
e Pr
ojet
o - A
dapt
er
Exemplos de Adapters• JSDK API: Tratamento de eventos (java.awt.event)• MouseAdapter, WindowAdapter, etc. são stubs para
implementação de adapters• JSDK API: Wrappers de tipos em Java• 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 d
e Pr
ojet
o - A
dapt
er
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.
Padr
ões d
e Pr
ojet
o - A
dapt
er
Exercício I• Refaça o adaptador que fizemos em sala utilizando o modelo
“Class Adapter”. É simples!
Padr
ões d
e Pr
ojet
o - A
dapt
er
Exercício II• 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:• “Compra” é composto por um objeto do tipo IPagamento
Padr
ões d
e Pr
ojet
o - A
dapt
er
Exercício II• 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 d
e Pr
ojet
o - A
dapt
er
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 d
e Pr
ojet
o - A
dapt
er
Referências• [1] Capítulo 7 do livro “Padrões de Projeto – Use a Cabeça!”