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

«Какую проблему решает паттерн «Адаптер»» — вопрос из категории Паттерны, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн "Адаптер" позволяет работать с несовместимыми интерфейсами, преобразуя один интерфейс класса в другой, ожидаемый клиентом. Это полезно при интеграции сторонних библиотек или устаревшего кода без изменения их исходного кода.

Пример:

interface PaymentGateway {
    public function pay(float $amount): void;
}

class LegacyPaymentSystem {
    public function makePayment(float $amount, string $currency): void {
        echo "Paying $amount $currency via legacy systemn";
    }
}

class PaymentAdapter implements PaymentGateway {
    private LegacyPaymentSystem $legacySystem;

    public function __construct(LegacyPaymentSystem $legacySystem) {
        $this->legacySystem = $legacySystem;
    }

    public function pay(float $amount): void {
        $this->legacySystem->makePayment($amount, 'USD');
    }
}

// Клиентский код работает с PaymentGateway
$gateway = new PaymentAdapter(new LegacyPaymentSystem());
$gateway->pay(100.50);

Адаптер преобразует вызов pay() в makePayment(), скрывая различия в интерфейсах.