Что такое паттерн "Адаптер" (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()); // Выведет: "Результат работы старой системы"
Когда стоит использовать паттерн «Адаптер»?
- Нужно использовать класс с несовместимым интерфейсом.
- Требуется интегрировать сторонний код без его изменения.
- Нужно унифицировать интерфейсы для удобства работы с разными объектами.
Отличие от других паттернов
- В отличие от декоратора, адаптер изменяет интерфейс объекта. Адаптер фокусируется на совместимости интерфейсов, а не на добавлении функциональности.
Плюсы паттерна
- Повышает гибкость и повторное использование кода.
- Позволяет интегрировать несовместимые классы.
- Изолирует изменения в одном месте — в адаптере.
Минусы паттерна
- Увеличивает количество классов в проекте.
- Может усложнить структуру, если использовать слишком много адаптеров.