Observer Kalıbı
Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 64.
Gözlemci Deseni, bir nesnenin (konu) durumu değiştiğinde birden çok nesneyi (gözlemcileri) bilgilendirdiği bire çok ilişkisi oluşturur.
Gözlemcileri yöneten basit bir Subject sınıfı:
class Subject:
def __init__(self):
self._observers = []
def add_observer(self, observer):
self._observers.append(observer)
def notify(self, message):
for observer in self._observers:
observer.update(message)Konu, gözlemcilerin bir listesini tutar ve hepsini aynı anda bilgilendirebilir.
Basit gözlemci sınıfları oluşturun:
class EmailNotifier:
def update(self, message):
print(f"Email sent: {message}")
class SMSNotifier:
def update(self, message):
print(f"SMS sent: {message}")Her gözlemcinin, bildirim gönderildiğinde çağrılan bir update yöntemi vardır.
Gözlemci desenini kullanın:
# Konu oluştur
news = Subject()
# Gözlemcileri oluştur
email = EmailNotifier()
sms = SMSNotifier()
# Gözlemcileri konuya ekle
news.add_observer(email)
news.add_observer(sms)
# Tüm gözlemcilere bildir
news.notify("Breaking news: Python is awesome!")Hisse senedi fiyatı takipçisiyle pratik bir örnek oluşturun:
class Stock:
def __init__(self, symbol, price):
self.symbol = symbol
self._price = price
self._observers = []
def add_observer(self, observer):
self._observers.append(observer)
def set_price(self, price):
self._price = price
self.notify()
def notify(self):
for observer in self._observers:
observer.update(self.symbol, self._price)
class Investor:
def __init__(self, name):
self.name = name
def update(self, symbol, price):
print(f"{self.name} notified: {symbol} is now ${price}")
# Hisse senedi takipçisini kullan
apple_stock = Stock("AAPL", 150)
investor1 = Investor("Alice")
investor2 = Investor("Bob")
apple_stock.add_observer(investor1)
apple_stock.add_observer(investor2)
apple_stock.set_price(155) # Tüm yatırımcıları bilgilendirirÇıktı:
Email sent: Breaking news: Python is awesome!
SMS sent: Breaking news: Python is awesome!
Alice notified: AAPL is now $155
Bob notified: AAPL is now $155Temel Nokta: Gözlemci Kalıbı, bir şey değiştiğinde bir nesnenin diğer birçok nesneyi otomatik olarak bilgilendirmesini sağlar. Özne, gözlemcilerin bir listesini tutar ve gerektiğinde onların update yöntemini çağırır. Bu; bildirimler, olay sistemleri ve uygulamanızın birden fazla bölümünü eşzamanlı tutmak için kullanışlıdır.
Görev
OrtaBir hava durumu izleme sistemi oluşturarak Observer Pattern'i uygulayın. Kodun belirtilen alanlarında iki sınıf oluşturmanız gerekiyor.
1. Adım: WeatherStation sınıfını oluşturun
Yorumun belirttiği yerde WeatherStation sınıfınızı yazın. Bu sınıf şunları yapmalıdır:
- Subject sınıfından kalıtım almalı (
class WeatherStation(Subject):kullanın) - Şunlarla başlatılmalı:
super().__init__()kullanarak üst sınıf oluşturucusunu çağırın- Tek alt çizgili bir öznitelik olan
self._temperature'i kullanarak başlangıç sıcaklığını 0 olarak ayarlayın (Python'ın dahili bir öznitelik için kullandığı kural)
- Şunu uygulamalı:
<strong>set_temperature(self, temperature)</strong>:- Dahili sıcaklık özniteliğini güncelleyin
- Tüm gözlemcileri bilgilendirmek için
self.notify(self._temperature)çağrısını yapın
- Şunu uygulamalı:
<strong>get_temperature(self)</strong>:- Mevcut sıcaklık değerini döndürün
2. Adım: WeatherDisplay sınıfını oluşturun
Yorumun belirttiği yerde WeatherDisplay sınıfınızı yazın. Bu sınıf şunları yapmalıdır:
- Observer sınıfından kalıtım almalı (
class WeatherDisplay(Observer):kullanın) - Şunlarla başlatılmalı:
- Bir
nameparametresi kabul edin - Adı
self.nameolarak saklayın
- Bir
- Şunu uygulamalı:
<strong>update(self, temperature)</strong>:- Sıcaklık güncelleme mesajını aşağıda gösterilen tam biçimde yazdırın
Mesaj biçimi:
Bir ekran sıcaklık güncellemesi aldığında tam olarak şunu yazdırmalıdır:
Display [name]: Current temperature is [temperature]CÖrnek kullanım:
# Hava durumu istasyonu ve ekranlar oluştur
station = WeatherStation()
phone_display = WeatherDisplay("Phone")
tablet_display = WeatherDisplay("Tablet")
# Ekranları istasyona bağla
station.attach(phone_display)
station.attach(tablet_display)
# Sıcaklığı güncelle - her iki ekran da bilgilendirilecek
station.set_temperature(25.5)
# Çıktı:
# Display Phone: Current temperature is 25.5C
# Display Tablet: Current temperature is 25.5CÖnemli notlar:
attach()vedetach()yöntemleri Subject temel sınıfında zaten uygulanmıştır; bunları uygulamanız veya WeatherStation sınıfınızda çağırmanız gerekmez- Yukarıdaki örnek kullanımda
station.attach(phone_display)çağrısı sınıfınızı kullanan kişi tarafından yapılır; WeatherStation uygulamanızın içinde yapılmaz - WeatherStation'ınızın yalnızca sıcaklık değiştiğinde
self.notify()çağrısını yapması gerekir; geri kalanını Subject temel sınıfı yönetir - Yukarıda belirtildiği üzere WeatherStation'da gerekli üç yöntemi ve WeatherDisplay'de gerekli iki yöntemi uygulamaya odaklanın
Kendin dene
class Subject:
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def detach(self, observer):
self._observers.remove(observer)
def notify(self, data):
for observer in self._observers:
observer.update(data)
class Observer:
def update(self, data):
pass
# WeatherStation sınıfınızı buraya yazın
# WeatherDisplay sınıfınızı buraya yazın
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 Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarı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ı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarı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ıKendi başına pratik yap: Online Python derleyicisi