Menu
Coddy logo textTech

Observer Deseni

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 73 / 91.

Observer Pattern, nesneler arasında bire-çok ilişkisi oluşturan davranışsal bir tasarım desenidir. Bir nesne (subject) durumunu değiştirdiğinde, tüm bağımlı nesneleri (observers) otomatik olarak bilgilendirilir ve güncellenir.

Bir bülten aboneliğini düşünün. Bülten özne, aboneler ise gözlemcilerdir. Yeni bir sayı yayımlandığında, bültenin her abonenin ayrıntılarını bilmesine gerek kalmadan tüm aboneler bunu otomatik olarak alır.

İşte PHP'de temel bir uygulama:

<?php
interface Observer {
    public function update(string $message): void;
}

class Newsletter {
    private array $subscribers = [];
    
    public function subscribe(Observer $observer): void {
        $this->subscribers[] = $observer;
    }
    
    public function publish(string $content): void {
        foreach ($this->subscribers as $subscriber) {
            $subscriber->update($content);
        }
    }
}

class EmailSubscriber implements Observer {
    public function __construct(private string $email) {}
    
    public function update(string $message): void {
        echo "Sending to {$this->email}: $message\n";
    }
}

$newsletter = new Newsletter();
$newsletter->subscribe(new EmailSubscriber("alice@example.com"));
$newsletter->subscribe(new EmailSubscriber("bob@example.com"));
$newsletter->publish("New article released!");

Çıktı:

Sending to alice@example.com: New article released!
Sending to bob@example.com: New article released!

Bu desen, özneyi gözlemcilerinden ayırır. Newsletter sınıfının e-posta abonelerini, SMS abonelerini veya anlık bildirim hizmetlerini bilgilendirip bilgilendirmediğini bilmesi gerekmez. Yalnızca Observer arayüzünü uygulayan her şey üzerinde update() çağrısını yapar. Bu, mevcut kodu değiştirmeden yeni gözlemci türleri eklemeyi zahmetsiz hâle getirir.

challenge icon

Görev

Kolay

Observer Pattern'ı kullanarak bir hisse senedi fiyatı uyarı sistemi oluşturalım. Bir hisse senedinin fiyatı değiştiğinde, kayıtlı tüm yatırımcılar otomatik olarak bilgilendirilmelidir: bu desenin gerçek dünyadaki mükemmel bir uygulaması.

Kodunuzu dört dosyaya ayıracaksınız:

  • Observer.php: Tek bir update(string $stockName, float $price): void metoduna sahip bir Observer arayüzü tanımlayın. Bu, bildirim almak için tüm gözlemcilerin uyması gereken sözleşmedir.
  • Investors.php: Observer dosyasını içe aktarın ve arayüzü uygulayan iki sınıf oluşturun:
    • EmailInvestor: Yapıcısında bir e-posta adresi alır (yapıcı terfisini kullanın). update() metodu "Email to [email]: [stockName] is now $[price]" çıktısını verir.
    • SmsInvestor: Yapıcısında bir telefon numarası alır. update() metodu "SMS to [phone]: [stockName] is now $[price]" çıktısını verir.
  • Stock.php: Observer dosyasını içe aktarın ve özne görevi gören bir Stock sınıfı oluşturun. Hisse senediniz şunları yapmalıdır:
    • Hisse senedi adını ve güncel fiyatı saklamak (ad için yapıcı terfisini kullanın, fiyatı 0.0 olarak başlatın)
    • Gözlemcilerden oluşan özel bir dizi tutmak
    • Gözlemcileri eklemek için bir subscribe(Observer $observer): void metoduna sahip olmak
    • Fiyatı güncelleyen ve tüm gözlemcileri bilgilendiren bir setPrice(float $price): void metoduna sahip olmak
    Gözlemcileri bilgilendirirken her gözlemcinin update() metodunu hisse senedi adı ve yeni fiyatla çağırın.
  • main.php: Investors ve Stock dosyalarını içe aktarın. Üç girdi alacaksınız: bir hisse senedi adı, bir e-posta adresi ve bir telefon numarası.

    Verilen adla bir Stock oluşturun. E-posta adresiyle bir EmailInvestor ve telefon numarasıyla bir SmsInvestor abone edin.

    Tüm abonelere bildirim göndermeyi tetiklemek için hisse senedi fiyatını 150.50 olarak ayarlayın.

Observer Pattern, Stock sınıfınızı belirli bildirim yöntemlerinden ayrık tutar. Daha sonra Stock sınıfını hiç değiştirmeden kolayca bir PushInvestor veya SlackInvestor ekleyebilirsiniz.

Kendin dene

<?php
require_once 'Investors.php';
require_once 'Stock.php';

// Girdileri oku
$stockName = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));

// TODO: Verilen isimle bir Stock oluştur

// TODO: E-posta adresiyle bir EmailInvestor abone et

// TODO: Telefon numarasıyla bir SmsInvestor abone et

// TODO: Bildirimleri tetiklemek için hisse senedi fiyatını 150.50 olarak ayarla
?>
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