Что такое паттерн "Адаптер" (Adapter)

Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе. Он служит мостом между двумя интерфейсами, обеспечивая совместимость, не изменяя исходные классы.

Представьте, что у вас есть два объекта с разными интерфейсами, которые должны взаимодействовать. Вместо изменения одного из них создаётся адаптер, который преобразует вызовы одного интерфейса в понятные другому.

Преимущества паттерна «Адаптер»

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

Пример:

  • Есть класс с одним интерфейсом.
  • Другой класс с несовместимым интерфейсом.
  • Создаётся адаптер, который «переводит» вызовы с одного интерфейса на другой.

Где применяется паттерн «Адаптер»?

  • Интеграция старого и нового кода.
  • Работа с внешними библиотеками с несовместимыми API.
  • Унификация интерфейсов в больших системах.

Пример реализации на JavaScript

// Класс с интерфейсом, который нужно адаптировать class OldSystem { specificRequest() { return "Результат работы старой системы"; } } // Новый интерфейс, ожидаемый клиентом class Target { request() { throw new Error("Метод request() должен быть реализован"); } } // Адаптер, который делает старый интерфейс совместимым с новым class Adapter extends Target { constructor(oldSystem) { super(); this.oldSystem = oldSystem; } request() { // Преобразуем вызов специфического метода в ожидаемый return this.oldSystem.specificRequest(); } } // Использование const oldSystem = new OldSystem(); const adapter = new Adapter(oldSystem); console.log(adapter.request()); // Выведет: "Результат работы старой системы"

Когда стоит использовать паттерн «Адаптер»?

  • Нужно использовать класс с несовместимым интерфейсом.
  • Требуется интегрировать сторонний код без его изменения.
  • Нужно унифицировать интерфейсы для удобства работы с разными объектами.

Отличие от других паттернов

  • В отличие от декоратора, адаптер изменяет интерфейс объекта. Адаптер фокусируется на совместимости интерфейсов, а не на добавлении функциональности.

Плюсы паттерна

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

Минусы паттерна

  • Увеличивает количество классов в проекте.
  • Может усложнить структуру, если использовать слишком много адаптеров.