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.
Görev
KolayObserver 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 birupdate(string $stockName, float $price): voidmetoduna sahip birObserverarayü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 birStocksı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.0olarak başlatın) - Gözlemcilerden oluşan özel bir dizi tutmak
- Gözlemcileri eklemek için bir
subscribe(Observer $observer): voidmetoduna sahip olmak - Fiyatı güncelleyen ve tüm gözlemcileri bilgilendiren bir
setPrice(float $price): voidmetoduna sahip olmak
update()metodunu hisse senedi adı ve yeni fiyatla çağırın.- Hisse senedi adını ve güncel fiyatı saklamak (ad için yapıcı terfisini kullanın, fiyatı
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
Stockoluşturun. E-posta adresiyle birEmailInvestorve telefon numarasıyla birSmsInvestorabone edin.Tüm abonelere bildirim göndermeyi tetiklemek için hisse senedi fiyatını
150.50olarak 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
?>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