Проверяет знание структурного паттерна «Адаптер» и умение объяснить, как он позволяет совместить несовместимые интерфейсы.
Адаптер — это паттерн, который позволяет двум несовместимым интерфейсам работать вместе. Он "оборачивает" существующий класс и преобразует вызовы в формат, который ожидает клиентский код. Это удобно при интеграции сторонних библиотек, смене API или миграции между системами. Паттерн помогает не переписывать старый код и постепенно переходить на новые реализации.
Определение: Адаптер — это объект-обёртка, который приводит интерфейс одного класса к интерфейсу, ожидаемому клиентским кодом.
Когда у вас есть:
код, который ожидает определённый интерфейс
сторонний класс или сервис с другим интерфейсом
необходимость "подружить" их без переписывания логики
Адаптер выступает как "переводчик".
Есть система, ожидающая интерфейс:
php
interface Logger {
public function log(string $message): void;
}
Но вы хотите использовать сторонний логгер:
php
class ExternalLogger {
public function write(string $text) { /* ... */ }
}
Их интерфейсы несовместимы.
Создаём класс-обёртку, приводящий интерфейс к нужному:
php
class ExternalLoggerAdapter implements Logger {
public function __construct(private ExternalLogger $logger) {}
public function log(string $message): void {
$this->logger->write($message);
}
}
Теперь клиентский код может работать с Logger, а адаптер переводит вызовы в формат ExternalLogger.
Интеграция сторонних библиотек
Когда потребности вашего кода не совпадают с API библиотеки.
Плавная миграция между версиями API
Например, при переходе от старой системы логирования к новой.
Унификация интерфейсов
Например, когда разные поставщики данных предоставляют разные форматы.
Совместимость с устаревшим кодом
Адаптер позволяет работать с новым кодом, сохраняя старую архитектуру.
Тестирование
Можно адаптировать классы под интерфейсы, которые удобнее мокать в тестах.
Адаптер идеально подходит для задач интеграции и нивелирования различий в интерфейсах. Он облегчает миграции и позволяет добавлять новые варианты поведения без переписывания существующего кода.