Что такое паттерн адаптер?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Паттерн адаптер (Adapter Pattern) — структурный паттерн проектирования, который позволяет классам с несовместимыми интерфейсами работать вместе. Он действует как обертка, преобразующая интерфейс одного класса в другой, ожидаемый клиентом.
Применение:
- Интеграция сторонних библиотек с несовместимыми интерфейсами.
- Использование существующих классов в новых системах без их модификации.
- Обеспечение взаимодействия между классами, разработанными независимо.
Пример реализации (объектный адаптер):
Представим, есть существующий класс LegacyService с методом oldRequest():
class LegacyService {
public void oldRequest() {
// старый код
}
}
И новый интерфейс NewService с методом newRequest():
interface NewService {
void newRequest();
}
Адаптер ServiceAdapter реализует NewService и содержит ссылку на LegacyService:
class ServiceAdapter implements NewService {
private LegacyService legacyService;
public ServiceAdapter(LegacyService legacyService) {
this.legacyService = legacyService;
}
@Override
public void newRequest() {
// Преобразование вызова нового метода в старый
legacyService.oldRequest();
}
}
Клиент может использовать LegacyService через интерфейс NewService:
NewService service = new ServiceAdapter(new LegacyService());
service.newRequest(); // Вызовет oldRequest() в LegacyService
Существует также разновидность — классный адаптер, который использует множественное наследование (если поддерживается языком) или наследование от адаптируемого класса и реализацию целевого интерфейса. В Java из-за отсутствия множественного наследования реализуется через наследование от адаптируемого класса и реализацию адаптерного интерфейса, но такой подход менее гибкий. Объектный адаптер более предпочтителен из-за возможности адаптировать подклассы и избегать жесткой связи.
Плюсы:
- Позволяет совместное использование несовместимых классов.
- Инкапсулирует детали преобразования интерфейсов.
- Повышает гибкость системы.
Минусы:
- Может увеличить сложность, добавляя новый класс.
- Производительность может немного снизиться из-за дополнительного уровня абстракции.