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 .