Adapter

Intenção

Converter a interface de uma classe em outra interface esperada pelos clientes.

Vantagens

Desvantagens

Exemplos

Exemplo #1

No projeto de um aparelho para IoT (Internet of Things), são adicionados sensores de diversos tipos como, por exemplo, sensor de temperatura, de umidade, de luminosidade, etc. Cada sensor tem uma interface diferente, oriunda do seu fabricante e da sua forma de funcionamento. Alguns sensores podem retornar strings, números ou valores que necessitam de tratamento especial para gerar um resultado útil ao cliente. Esse resultado será exibido em um painel como uma string (por ex.,"30ºC"). Em alguns casos, o resultado pode demandar que determinados sensores trabalhem em conjunto (por ex. vários sensores de umidade no mesmo aparelho) na obtenção de um único valor calculado (por ex. a média de umidade). Com o padrão Adapter, as solicitações de getStatus(), declarada na interface SensorInformation, são convertidas para solicitações readValue() na classe TextualInformation. Uma vez que TextualInformation adapta Sensor à interface SensorInformation, é possível reutilizar as subclasses de Sensor que seriam incompatíveis de outra forma. 

Diagrama de Classe

Exemplo #1 - Diagrama

Participantes

  • Target (SensorInformation):  define a interface específica do domínio que Client usa.

  • Client: colabora com objetos compatíveis com a interface de Target.

  • Adaptee (Sensor): define uma interface existente que precisa se adaptada.

  • Adapter (TextualInformation): adapta a interface do Adaptee à interface do Target.

 

Código

/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.adapter;

/**
 *
 * @author Adriano Gonçalves
 */
public class Principal {

    public static void main(String[] args) {
        SensorInformation temperature = new TextualInformation(new TemperatureSensor());
        SensorInformation humidity = new TextualInformation(new HumiditySensor());
        SensorInformation luminosity = new TextualInformation(new LuminositySensor());

        System.out.println("Temperature: " + temperature.getStatus());
        System.out.println("Humidity: " + humidity.getStatus());
        System.out.println("Luminosity: " + luminosity.getStatus());
    }
}
package com.padroesdr.adapter;

public class TextualInformation implements SensorInformation {

    private Sensor adaptee;

    public TextualInformation(Sensor sensor) {
        adaptee = sensor;
    }

    @Override
    public String getStatus() {
        return Float.toString(adaptee.readValue());
    }

}
package com.padroesdr.adapter;

public interface SensorInformation {

    public String getStatus();
}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.adapter;

/**
 *
 * @author Adriano Gonçalves
 */
public class HumiditySensor extends Sensor {

    @Override
    public float readValue() {
        // Do something and return the result
        return (float) ((float) Math.random() * 100.);
    }

}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.adapter;

/**
 *
 * @author Adriano Gonçalves
 */
public abstract class Sensor {

    public abstract float readValue();
}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.adapter;

/**
 *
 * @author Adriano Gonçalves
 */
public class LuminositySensor extends Sensor {

    @Override
    public float readValue() {
        // Do something and return the result
        return (float) ((float) Math.random() * 100.);
    }

}
/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.padroesdr.adapter;

/**
 *
 * @author Adriano Gonçalves
 */
public class TemperatureSensor extends Sensor {

    @Override
    public float readValue() {
        // Do something and return the result
        return (float) ((Math.random() * 100.) * (Math.random() < 0.5 ? 1. : -1.));
    }

}
Clique aqui para fazer o download do código completo de implementação deste Design Pattern.

Padrões Relacionados

Este Padrão pode ser usado para resolver os seguintes problemas: