«1. Обзор

В этом кратком руководстве мы рассмотрим шаблон адаптера и его реализацию на языке Java.

2. Шаблон адаптера

Шаблон адаптера действует как соединитель между двумя несовместимыми интерфейсами, которые в противном случае не могут быть соединены напрямую. Адаптер оборачивает существующий класс новым интерфейсом, чтобы он стал совместимым с интерфейсом клиента.

Основным мотивом использования этого шаблона является преобразование существующего интерфейса в другой интерфейс, ожидаемый клиентом. Обычно это реализуется после разработки приложения.

2.1. Пример шаблона адаптера

Рассмотрим сценарий, в котором есть приложение, разработанное в США, которое возвращает максимальную скорость роскошных автомобилей в милях в час (MPH). Теперь нам нужно использовать то же приложение для нашего клиента в Великобритании, которому нужны те же результаты, но в километрах в час (км/ч).

Чтобы решить эту проблему, мы создадим адаптер, который будет преобразовывать значения и давать нам желаемые результаты:

Во-первых, мы создадим исходный интерфейс Movable, который должен возвращать скорость какой-то роскоши. автомобилей в милях в час:

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

Теперь мы создадим одну конкретную реализацию этого интерфейса:

public class BugattiVeyron implements Movable {
 
    @Override
    public double getSpeed() {
        return 268;
    }
}

Теперь мы создадим интерфейс адаптера MovableAdapter, который будет основан на том же классе Movable. Его можно немного изменить, чтобы получить разные результаты в разных сценариях:

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

Реализация этого интерфейса будет состоять из закрытого метода convertMPHtoKMPH(), который будет использоваться для преобразования:

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;
    }
}

Теперь мы используйте только методы, определенные в нашем адаптере, и мы получим конвертированные скорости. В этом случае будет верным следующее утверждение:

@Test
public void whenConvertingMPHToKMPH_thenSuccessfullyConverted() {
    Movable bugattiVeyron = new BugattiVeyron();
    MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron);
 
    assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001);
}

Как мы видим здесь, наш адаптер преобразует 268 миль в час в 431 км/ч для этого конкретного случая.

2.2. Когда использовать шаблон адаптера

    Когда внешний компонент предоставляет интересную функциональность, которую мы хотели бы использовать повторно, но она несовместима с нашим текущим приложением. Можно разработать подходящий адаптер, чтобы сделать их совместимыми друг с другом Когда наше приложение несовместимо с интерфейсом, который ожидает наш клиент Когда мы хотим повторно использовать устаревший код в нашем приложении без внесения каких-либо изменений в исходный код

3. Заключение

В этой статье мы рассмотрели шаблон проектирования адаптера в Java.

Полный исходный код этого примера доступен на GitHub.