Menu
Coddy logo textTech

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 Stripe

Adaptö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.

challenge icon

Görev

Kolay

Adapter 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ği TemperatureSensor arayüzünü tanımlayın. Bu arayüz, sıcaklığı Celsius cinsinden döndüren getTemperature(): float metoduna sahip olmalıdır.
  • LegacySensor.php: Eski donanımı simüle eden bir LegacySensor sı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(): float metoduna sahiptir
  • LegacySensorAdapter.php: Hem TemperatureSensor arayüzünü hem de LegacySensor sınıfını dahil edin. TemperatureSensor arayüzünü uygulayan ve bir LegacySensor saran LegacySensorAdapter sınıfını oluşturun. Adaptörünüz:
    • Yapıcısında bir LegacySensor kabul 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
  • main.php: LegacySensorAdapter dosyasını dahil edin. Tek bir girdi alacaksınız: Fahrenheit cinsinden bir sıcaklık.

    Girdi sıcaklığıyla bir LegacySensor oluşturun, ardından bunu bir LegacySensorAdapter içine sarın. Adaptör üzerinde getTemperature() 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

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi