Gymterview
junior

Что такое паттерн Adapter?

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

Аналогия из жизни: Adapter – как переходник для розетки. Европейская вилка не подходит к американской розетке, но адаптер решает проблему, не меняя ни вилку, ни розетку.

Пример кода
// Существующий интерфейс
interface MediaPlayer {
    void play(String filename);
}

// Несовместимый интерфейс стороннего API
class AdvancedPlayer {
    void playMp4(String file) { /* ... */ }
    void playMkv(String file) { /* ... */ }
}

// Адаптер
class MediaAdapter implements MediaPlayer {
    private final AdvancedPlayer advancedPlayer = new AdvancedPlayer();

    @Override
    public void play(String filename) {
        if (filename.endsWith(".mp4")) advancedPlayer.playMp4(filename);
        else if (filename.endsWith(".mkv")) advancedPlayer.playMkv(filename);
    }
}

Примеры Adapter в JDK

  • Arrays.asList(array) – адаптирует массив к интерфейсу List
  • InputStreamReader – адаптирует InputStream (байты) к Reader (символы)
  • Collections.enumeration(collection) – адаптирует Collection к Enumeration

Adapter vs Facade

Критерий Adapter Facade
Цель Адаптировать один интерфейс к другому Упростить сложную подсистему
Количество классов Работает с одним классом Объединяет несколько классов
Интерфейс Преобразует существующий Создаёт новый упрощённый

Частые ошибки

  • Adapter с бизнес-логикой – адаптер только преобразует интерфейс, не добавляет логику
  • Путать Adapter и Facade – Adapter адаптирует один интерфейс к другому, Facade упрощает подсистему

Как используется в 2026

  • Spring: HandlerAdapter адаптирует разные типы контроллеров к единому DispatcherServlet
  • Интеграция legacy-систем – адаптеры для старых API

На собеседовании: приведите пример из JDK (Arrays.asList, InputStreamReader) и объясните два типа адаптеров: Object Adapter (композиция, предпочтительнее) и Class Adapter (наследование). Частая ошибка – путать Adapter с Facade.