Adaptör Kalıbı
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 76 / 91.
Adapter Deseni, uyumsuz arayüzlere sahip nesnelerin birlikte çalışmasına olanak tanıyan yapısal bir tasarım desenidir. İki arayüz arasında bir köprü görevi görerek çağrıları bir formattan diğerine çevirir.
Ödemeleri işleyen bir uygulama oluşturduğunuzu ve üçüncü taraf bir ödeme kütüphanesini entegre etmeniz gerektiğini hayal edin. Kütüphane mükemmel çalışıyor, ancak arayüzü kodunuzun beklediğiyle eşleşmiyor. Tüm uygulamanızı yeniden yazmak yerine, ikisi arasında çeviri yapan bir adaptör oluşturursunuz.
<?php
// Uygulamanızın beklediği arayüz
interface PaymentProcessor {
public function pay(float $amount): string;
}
// Farklı bir arayüze sahip üçüncü taraf kütüphanesi
class StripeAPI {
public function createCharge(int $cents, string $currency): string {
return "Charged {$cents} {$currency} via Stripe";
}
}
Adaptör, dahili olarak üçüncü taraf sınıfı kullanırken beklediğiniz arayüzü uygular:
<?php
class StripeAdapter implements PaymentProcessor {
public function __construct(private StripeAPI $stripe) {}
public function pay(float $amount): string {
$cents = (int)($amount * 100);
return $this->stripe->createCharge($cents, 'USD');
}
}
$stripe = new StripeAPI();
$processor = new StripeAdapter($stripe);
echo $processor->pay(29.99);
Çıktı:
Charged 2999 USD via StripeAdaptör, dolarları sente dönüştürür ve uygun metodu çağırır. Uygulama kodunuz yalnızca PaymentProcessor yapısını bilir ve Stripe'ın özel gereksinimlerinden tamamen habersiz kalır. Daha sonra farklı bir ödeme sağlayıcısına geçerseniz, mevcut kodunuzu değiştirmeden sadece yeni bir adaptör oluşturursunuz.
Görev
KolayAdapter Desenini kullanarak bir sıcaklık dönüştürme sistemi oluşturalım. Elinizde Fahrenhayt cinsinden okuma yapan eski bir sıcaklık sensörü var, ancak modern hava durumu uygulamanız tüm sıcaklıkların Santigrat (Celsius) cinsinden olmasını bekliyor. Her iki sistemi de değiştirmek yerine, aradaki boşluğu dolduran bir adaptör oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
TemperatureSensor.php— Hava durumu uygulamanızın beklediği birTemperatureSensorarayüzü (interface) tanımlayın. Bu arayüz, Santigrat cinsinden sıcaklığı döndüren birgetTemperature(): floatmetoduna sahip olmalıdır.LegacySensor.php— Eski donanımı simüle eden birLegacySensorsınıfı oluşturun. Bu sınıf, uygulamanızın ihtiyaç duyduğundan farklı bir arayüze sahiptir:- Yapıcısında (constructor) bir Fahrenhayt değeri alır (constructor promotion kullanın)
- Saklanan Fahrenhayt değerini döndüren bir
readFahrenheit(): floatmetoduna sahiptir
LegacySensorAdapter.php— Hem TemperatureSensor arayüzünü hem de LegacySensor sınıfını dahil edin.TemperatureSensorarayüzünü uygulayan ve birLegacySensornesnesini sarmalayan birLegacySensorAdaptersınıfı oluşturun. Adaptörünüz şunları yapmalıdır:- Yapıcısında bir
LegacySensorkabul etmelidir - Eski sensörden Fahrenhayt değerini okuyup
(fahrenheit - 32) * 5 / 9formülünü kullanarak Santigrat'a dönüştürerekgetTemperature()metodunu uygulamalıdır
- Yapıcısında bir
main.php— LegacySensorAdapter dosyasını dahil edin. Bir girdi alacaksınız: Fahrenhayt cinsinden bir sıcaklık.Girdi sıcaklığı ile bir
LegacySensoroluşturun, ardından bunu birLegacySensorAdapteriçine sarmalayın. Adaptör üzerindegetTemperature()metodunu çağırın ve sonucu virgülden sonra iki basamağa yuvarlayarak yazdırın.Çıktı formatı şu şekilde olmalıdır:
Temperature: [celsius]C
Bu zorluk, Adapter Deseninin mevcut kodu değiştirmeden uyumsuz arayüzleri nasıl entegre etmenize izin verdiğini gösterir. Hava durumu uygulamanız yalnızca TemperatureSensor arayüzü ile çalışır ve gerçek okumaların eski bir Fahrenhayt sensöründen geldiğinden tamamen habersizdir.
Kopya kağıdı
Adapter Pattern (Adaptör Deseni), uyumsuz arayüzlere sahip nesnelerin aralarında bir köprü görevi görerek birlikte çalışmasını sağlayan yapısal bir tasarım desenidir.
Temel Yapı
Uygulamanızın beklediği arayüzü tanımlayın:
<?php
interface PaymentProcessor {
public function pay(float $amount): string;
}Farklı bir arayüzü olan üçüncü taraf bir sınıf:
<?php
class StripeAPI {
public function createCharge(int $cents, string $currency): string {
return "Charged {$cents} {$currency} via Stripe";
}
}Adaptörü Oluşturma
Adaptör, beklenen arayüzü uygularken dahili olarak üçüncü taraf sınıfı kullanır:
<?php
class StripeAdapter implements PaymentProcessor {
public function __construct(private StripeAPI $stripe) {}
public function pay(float $amount): string {
$cents = (int)($amount * 100);
return $this->stripe->createCharge($cents, 'USD');
}
}Kullanım
$stripe = new StripeAPI();
$processor = new StripeAdapter($stripe);
echo $processor->pay(29.99);
// Çıktı: Charged 2999 USD via StripeAdaptör, arayüzler arasında çeviri yaparak, üçüncü taraf kütüphaneleri entegre ederken veya uygulamaları değiştirirken uygulama kodunuzun değişmeden kalmasını sağlar.
Kendin dene
<?php
require_once 'LegacySensorAdapter.php';
// Girişi oku
$fahrenheit = floatval(trim(fgets(STDIN)));
// YAPILACAK: Giriş sıcaklığı ile bir LegacySensor oluşturun
// YAPILACAK: Bunu bir LegacySensorAdapter içine sarın
// YAPILACAK: Adaptör üzerinde getTemperature() metodunu çağırın
// YAPILACAK: Sonucu iki ondalık basamağa yuvarlayarak yazdırın
// Çıktı formatı: Temperature: [celsius]C
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi