O padrão do adaptador em Java

O padrão do adaptador em Java

1. Visão geral

Neste tutorial rápido, daremos uma olhada no padrão Adapter e sua implementação Java.

2. Padrão do adaptador

An Adapter pattern acts as a connector between two incompatible interfaces that otherwise cannot be connected directly. Um adaptador envolve uma classe existente com uma nova interface para que se torne compatível com a interface do cliente.

O principal motivo por trás do uso desse padrão é converter uma interface existente em outra interface que o cliente espera. Geralmente é implementado assim que o aplicativo é projetado.

2.1. Exemplo de padrão de adaptador

Considere um cenário em que há um aplicativo desenvolvido nos EUA que retorna a velocidade máxima de carros de luxo em milhas por hora (MPH). Agora, precisamos usar o mesmo aplicativo para nosso cliente no Reino Unido que deseja os mesmos resultados, mas em quilômetros por hora (km / h).

Para lidar com esse problema, criaremos um adaptador que converterá os valores e nos fornecerá os resultados desejados:

image

Primeiro, vamos criar a interface originalMovable que deve retornar a velocidade de alguns carros de luxo em milhas por hora:

public interface Movable {
    // returns speed in MPH
    double getSpeed();
}

Agora vamos criar uma implementação concreta dessa interface:

public class BugattiVeyron implements Movable {

    @Override
    public double getSpeed() {
        return 268;
    }
}

Agora vamos criar uma interface de adaptadorMovableAdapter que será baseada na mesma classeMovable. Pode ser ligeiramente modificado para gerar resultados diferentes em diferentes cenários:

public interface MovableAdapter {
    // returns speed in KM/H
    double getSpeed();
}

A implementação desta interface consistirá no método privadoconvertMPHtoKMPH() que será usado para a conversão:

public class MovableAdapterImpl implements MovableAdapter {
    private Movable luxuryCars;

    // standard constructors

    @Override
    public double getSpeed() {
        return convertMPHtoKMPH(luxuryCars.getSpeed());
    }

    private double convertMPHtoKMPH(double mph) {
        return mph * 1.60934;
    }
}

Agora usaremos apenas os métodos definidos em nosso adaptador e obteremos as velocidades convertidas. Nesse caso, a seguinte asserção será verdadeira:

@Test
public void whenConvertingMPHToKMPH_thenSuccessfullyConverted() {
    Movable bugattiVeyron = new BugattiVeyron();
    MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron);

    assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001);
}

Como podemos notar aqui, nosso adaptador converte268 mph em431 km/h para este caso particular.

2.2. Quando usar o padrão do adaptador

  • When an outside component provides captivating functionality that we’d like to reuse, but it’s incompatible with our current application. Um adaptador adequado pode ser desenvolvido para torná-los compatíveis entre si

  • Quando nosso aplicativo não é compatível com a interface que nosso cliente espera

  • Quando queremos reutilizar o código legado em nosso aplicativo sem fazer nenhuma modificação no código original

3. Conclusão

Neste artigo, vimos o padrão de design do adaptador em Java.

O código-fonte completo para este exemplo está disponívelover on GitHub.