← Назад к вопросам

Какую проблему решает паттерн "Адаптер"?

1.7 Middle🔥 113 комментариев
#Архитектура и паттерны

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проблема, которую решает паттерн "Адаптер"

Паттерн Адаптер (Adapter), также известный как Wrapper, решает фундаментальную проблему несовместимости интерфейсов в объектно-ориентированных системах. Когда компоненты системы должны взаимодействовать, но их интерфейсы несовместимы, Адаптер выступает в роли "переводчика" или "конвертера", обеспечивая их совместную работу без изменения их исходного кода.

Ключевые проблемы, которые устраняет паттерн

1. Интеграция устаревших систем или сторонних библиотек Часто возникает необходимость использовать старый проверенный код или сторонние компоненты, интерфейсы которых не соответствуют ожиданиям вашей текущей системы. Прямое изменение этого кода может быть невозможно (закрытые библиотеки) или нежелательно (риск внесения ошибок).

// Старая система с устаревшим интерфейсом
class OldLogger {
    public function writeToFile($message, $filename) {
        // устаревшая реализация
    }
}

// Новый код ожидает современный интерфейс
interface NewLoggerInterface {
    public function log(string $message): void;
}

// Адаптер делает старое совместимым с новым
class OldLoggerAdapter implements NewLoggerInterface {
    private $oldLogger;
    
    public function __construct(OldLogger $logger) {
        $this->oldLogger = $logger;
    }
    
    public function log(string $message): void {
        $this->oldLogger->writeToFile($message, 'app.log');
    }
}

2. Снижение связанности между компонентами Адаптер создает промежуточный слой абстракции, который уменьшает прямую зависимость между клиентским кодом и адаптируемым объектом. Это соответствует принципу инверсии зависимостей (Dependency Inversion Principle).

3. Унификация разнородных интерфейсов В системах, где используются несколько похожих по функциональности, но различных по интерфейсу компонентов (например, различные платежные системы, API социальных сетей, провайдеры данных), адаптер позволяет создать единый интерфейс для работы со всеми ними.

// Единый интерфейс для платежных систем
interface PaymentProcessor {
    public function processPayment(float $amount): bool;
}

// Адаптер для Stripe
class StripeAdapter implements PaymentProcessor {
    private $stripe;
    
    public function __construct() {
        $this->stripe = new Stripe\StripeClient();
    }
    
    public function processPayment(float $amount): bool {
        return $this->stripe->charge($amount * 100); // конвертация в центы
    }
}

// Адаптер для PayPal
class PayPalAdapter implements PaymentProcessor {
    private $paypal;
    
    public function __construct() {
        $this->paypal = new PayPal\Client();
    }
    
    public function processPayment(float $amount): bool {
        return $this->paypal->makePayment($amount);
    }
}

4. Соблюдение принципа открытости/закрытости (Open/Closed Principle) Система становится открытой для расширения (можно добавлять новые адаптеры для новых компонентов) и закрытой для модификации (не нужно изменять существующий код для интеграции новых компонентов).

Реальный пример из PHP разработки

В современных PHP фреймворках адаптеры часто используются для:

  • Работы с различными драйверами кэширования (Memcached, Redis, файлы)
  • Подключения разных СУБД через единый интерфейс PDO
  • Интеграции различных сервисов отправки почты (SMTP, Mailgun, SendGrid)
  • Адаптации разных шаблонизаторов к единому интерфейсу

Преимущества использования паттерна

  • Повторное использование кода — позволяет использовать существующие классы, даже если их интерфейсы несовместимы
  • Гибкость системы — легко добавлять поддержку новых компонентов через создание новых адаптеров
  • Тестируемость — можно создавать mock-адаптеры для тестирования
  • Чистая архитектура — разделение ответственности между бизнес-логикой и интеграционным кодом

Таким образом, паттерн Адаптер решает проблему интеграционной совместимости, позволяя различным компонентам с несовпадающими интерфейсами работать вместе, сохраняя при этом принципы чистого кода и слабой связанности компонентов системы.

Какую проблему решает паттерн "Адаптер"? | PrepBro