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)– адаптирует массив к интерфейсуListInputStreamReader– адаптирует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.