Adapter

Adapter

Adapter(Adaptador) é um padrão de projeto que permite que um objeto seja utilizado por outro que espera uma interface diferente. [1].

Interface, aqui, não se refere ao tipo Interface do Java e sim ao contrato que o objeto publica. Ou seja, o conjunto de métodos, parametros e funcionalidades publicos. Para evitar confusão de linguagem, chamarei contrato ao conjunto de métodos , parametros e funcionalidades que o objeto define e podem ser utilizados por outros objetos.

O problema

Você precisa utilizar um novo objeto, no lugar de um outro que utilizava antes, mas o contrato dele não é diretamente compativel com as instruções do objeto que o utiliza. Vc não quer mudar todo o seu programa. Mas sem mudar o programa não pode usar a nova classe.

A solução

O padrão propõe que se construa um novo objeto, o Adapter. Este objeto terá a interface que o objeto cliente espera utilizar mas ele delegará todos os comandos para um outro objeto que tem uma interface diferente.

Implementação

O padrão Adapter pode ser utilizando tanto quando o contrato original é especificada por uma classe java ou por uma interface. É mais facil quando o contrato é definido por uma interface, porque desta forma você sabe que pode sempre criar um objeto com aquele contrato. Ao trabalhar com classes é mais complexo. Se a classe é final e não pode ser herdada criar um adaptador é impossivel. Exemplo de implementação baseado em interface

A ideia é sempre fornecer o mesmo contrato à classe cliente de forma que nenhum codigo seja alterado.

Padrões relacionados

Adapter se relaciona a muitos outros padrões pela semelhança entre as implementações. O padrão mais fácil de confundir com Adapter é Proxy. Enquanto o Adapter visa apenas traduzir contratos entre o cliente e o objeto final o Proxy visa poder interferir entre a chamada do cliente e a execução do objeto real.Normalmente sem, sequer, alterar o contrato no caminho.

Wrapper é um tipo especial de Adapter. Ele não visa traduzir contratos mas aumentar o numero de operações possiveis com base num tipo previamente existente. Ou seja, o Wrapper adiciona um contrato que não existia antes. Na API do Java SE as classes filhas de Number , Character e Boolean são Wrapper de tipos primitivos. Obviamente as interfaces são diferentes já que as classes Wrapper adicionam novas operações uteis não disponiveis no contrato dos tipos primitivos correspondentes.

Adaptor comunica apenas com um outro objeto e nunca com um conjunto de objetos. Nesse caso estaremos na presença de um Façade que visa simplificar a utilização de um conjunto de objetos encapsulando as operações mais comums com esses objetos. Embora esteja sendo feita uma tradução de contratos, Façade vai um pouco mais além introduzindo uma logica de cooperação entre os objetos chamados.

Mapeia Contratos Altera Contrato Adiciona logica Comunica com mais que um objeto
Adapter X
Wrapper X X
Proxy X X
Façade X X X X

Referências

[1] Design Patterns: Elements of Reusable Object-Oriented Software
Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides
URL: 1995 Addison-Wesley

Licença

Creative Commons License Sérgio Taborda
Este trabalho é licenciado sob a
Licença Creative Commons Atribuição-Uso Não-Comercial-Não a obras derivadas 3.0 Genérica .

5 opiniões sobre “Adapter”

  1. Muito bom o teu artigo. No Head First: Design Patterns eles dão alguns exemplos interessantes do padrão Adapter também.

    Apenas uma “correção”, acho que ali onde tu escreveu:

    “Wrapper é um tipo especial de Wrapper”

    Deveria ser:

    “Wrapper é um tipo especial de Adapter”

    Não é?

    Abraço.

  2. Dando uma “googlada” por aí em busca de um material sobre Adapter, encontrei esse excelente material e ainda acabei navegando um pouco mais pelo wblog. A publicação foi realizada em 2008, mas nunca é tarde pra agradecer. Parabéns Sergio.

  3. Sérgio parabés pelo material, estava com um pouco de dificuldade em enteder a aplicabilidade do Adapter e seu texto ficou bastante claro…

Deixe um comentário