Ответ
Паттерн "Адаптер" позволяет работать с несовместимыми интерфейсами, преобразуя один интерфейс класса в другой, ожидаемый клиентом. Это полезно при интеграции сторонних библиотек или устаревшего кода без изменения их исходного кода.
Пример:
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(), скрывая различия в интерфейсах.