Назад к вопросам
Junior
68
questionbank

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

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 из-за отсутствия множественного наследования реализуется через наследование от адаптируемого класса и реализацию адаптерного интерфейса, но такой подход менее гибкий. Объектный адаптер более предпочтителен из-за возможности адаптировать подклассы и избегать жесткой связи.

Плюсы:

  • Позволяет совместное использование несовместимых классов.
  • Инкапсулирует детали преобразования интерфейсов.
  • Повышает гибкость системы.

Минусы:

  • Может увеличить сложность, добавляя новый класс.
  • Производительность может немного снизиться из-за дополнительного уровня абстракции.