Патерн Adapter потрібен, коли два компоненти мають несумісні інтерфейси.
Він дозволяє підключити сторонню бібліотеку без переписування коду.
Адаптер перекладає виклики у формат, який розуміє залежність.
Це особливо корисно для платіжних шлюзів, логерів чи зовнішніх API.
Завдяки адаптеру основний код працює з єдиним контрактом.
Підміна провайдера відбувається без змін бізнес-логіки.
У прикладі StripeAdapter перекладає наш контракт PaymentGateway у виклики SDK Stripe - якщо завтра прийде інший процесинг, ми напишемо новий адаптер, а решта коду не зміниться.
Коли НЕ варто: якщо ви контролюєте обидва боки і можете відразу узгодити інтерфейси - адаптер зайвий. Він потрібен саме для несумісного чужого коду, який не можна змінити.
interface PaymentGateway
{
public function charge(int $amount, string $currency): string;
}
class StripeClient
{
public function pay(array $payload): array
{
return ['id' => 'ch_123'];
}
}
class StripeAdapter implements PaymentGateway
{
public function __construct(private StripeClient $client) {}
public function charge(int $amount, string $currency): string
{
$result = $this->client->pay([
'amount' => $amount,
'currency' => $currency,
]);
return $result['id'];
}
}