Перейти к основному содержимому

Паттерн "Адаптер" (Adapter) в Java — совместимость с легаси и внешними SDK

Разработчику Архитектору

Обзор — в структурных паттернах. Здесь — практическая адаптация несовместимого интерфейса под контракт приложения.

Загрузка редактора схем…

Задача паттерна

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

Частый кейс — сторонний SDK или легаси-компонент, который менять нельзя.


Пример

interface NotificationService {
void send(String userId, String text);
}

class LegacySmsGateway {
void sendSms(String phone, String body) {
System.out.println("Legacy SMS -> " + phone + ": " + body);
}
}

class SmsGatewayAdapter implements NotificationService {
private final LegacySmsGateway gateway;
private final UserPhoneResolver resolver;

SmsGatewayAdapter(LegacySmsGateway gateway, UserPhoneResolver resolver) {
this.gateway = gateway;
this.resolver = resolver;
}

@Override
public void send(String userId, String text) {
String phone = resolver.resolve(userId);
gateway.sendSms(phone, text);
}
}

interface UserPhoneResolver {
String resolve(String userId);
}

Клиентский код работает только с NotificationService, не зная о деталях LegacySmsGateway.


Когда использовать

  • интеграция внешней библиотеки с неудобным API;
  • миграция легаси в новую архитектуру;
  • необходимость изолировать внешний контракт в одном месте.

Adapter и Facade

AdapterFacade
ЦельПреобразовать интерфейсУпростить доступ к подсистеме
ОбъектЧасто один конкретный компонентГруппа компонентов

См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").