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 Pattern, uyumsuz arayüzlere sahip nesnelerin birlikte çalışmasını sağlayan yapısal bir tasarım desenidir. İki arayüz arasında köprü görevi görerek çağrıları bir biçimden diğerine dönüştürür.
Ödemeleri işleyen bir uygulama geliştirdiğinizi ve üçüncü taraf bir ödeme kitaplığını entegre etmeniz gerektiğini düşünün. Kitaplık 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üphane
class StripeAPI {
public function createCharge(int $cents, string $currency): string {
return "Charged {$cents} {$currency} via Stripe";
}
}
Adaptörünüz, dahili olarak üçüncü taraf sınıfını 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 yöntemi çağırır. Uygulama kodunuz yalnızca PaymentProcessor hakkında bilgi sahibidir; 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 yalnızca yeni bir adaptör oluşturursunuz.
Görev
KolayAdapter Pattern'ı kullanarak bir sıcaklık dönüştürme sistemi oluşturalım. Fahrenheit cinsinden ölçümler üreten eski bir sıcaklık sensörünüz var, ancak modern hava durumu uygulamanız tüm sıcaklıkları Celsius cinsinden bekliyor. Her iki sistemi de değiştirmek yerine, aradaki uyumsuzluğu gideren bir adaptör oluşturacaksınız.
Kodunuzu dört dosyaya ayıracaksınız:
TemperatureSensor.php: Hava durumu uygulamanızın beklediğiTemperatureSensorarayüzünü tanımlayın. Bu arayüz, sıcaklığı Celsius cinsinden döndürengetTemperature(): floatmetoduna sahip olmalıdır.LegacySensor.php: Eski donanımı simüle eden birLegacySensorsınıfı oluşturun. Bu sınıfın arayüzü, uygulamanızın ihtiyaç duyduğundan farklıdır:- Yapıcısında Fahrenheit cinsinden bir ölçüm alır (yapıcı destekli özellik tanımlamasını kullanın)
- Depolanan Fahrenheit değerini döndüren
readFahrenheit(): floatmetoduna sahiptir
LegacySensorAdapter.php: Hem TemperatureSensor arayüzünü hem de LegacySensor sınıfını dahil edin.TemperatureSensorarayüzünü uygulayan ve birLegacySensorsaranLegacySensorAdaptersınıfını oluşturun. Adaptörünüz:- Yapıcısında bir
LegacySensorkabul etmelidir - Eski sensörden Fahrenheit değerini okuyup şu formülü kullanarak Celsius'a dönüştürerek
getTemperature()metodunu uygulamalıdır:(fahrenheit - 32) * 5 / 9
- Yapıcısında bir
main.php: LegacySensorAdapter dosyasını dahil edin. Tek bir girdi alacaksınız: Fahrenheit cinsinden bir sıcaklık.Girdi sıcaklığıyla bir
LegacySensoroluşturun, ardından bunu birLegacySensorAdapteriçine sarın. Adaptör üzerindegetTemperature()metodunu çağırın ve sonucu iki ondalık basamağa yuvarlayarak yazdırın.Çıktı biçimi şu şekilde olmalıdır:
Temperature: [celsius]C
Bu çalışma, Adapter Pattern'ın mevcut kodu değiştirmeden uyumsuz arayüzleri entegre etmenizi nasıl sağladığını gösterir. Hava durumu uygulamanız yalnızca TemperatureSensor arayüzüyle çalışır ve gerçek ölçümlerin eski bir Fahrenheit sensöründen geldiğinden tamamen habersizdir.
Kendin dene
<?php
require_once 'LegacySensorAdapter.php';
// Girdiyi oku
$fahrenheit = floatval(trim(fgets(STDIN)));
// TODO: Giriş sıcaklığıyla bir LegacySensor oluştur
// TODO: Bunu bir LegacySensorAdapter içine sar
// TODO: Adaptör üzerinde getTemperature() çağır
// TODO: Sonucu iki ondalık basamağa yuvarlayarak yazdır
// Çı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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi