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!”