Observer Kalıbı
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 47 / 64.
Observer Deseni (Gözlemci Deseni), bir nesnenin (subject) durumu değiştiğinde birden fazla nesneyi (observers) bilgilendirdiği bire-çok bir ilişki oluşturur.
İşte 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 aldığında çağrılan bir update metodu vardır.
Observer 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özlemcileri bilgilendir
news.notify("Breaking news: Python is awesome!")Bir hisse senedi fiyat takipçisi ile 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}")
# Use the stock tracker
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) # Notifies all investorsÇı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 $155Anahtar Nokta: Gözlemci Deseni (Observer Pattern), bir nesnenin bir şey değiştiğinde diğer birçok nesneyi otomatik olarak bilgilendirmesini sağlar. Konu (subject), gözlemcilerin bir listesini tutar ve gerektiğinde onların update metodunu çağırır. Bu; bildirimler, olay sistemleri ve uygulamanızın birden fazla parçasını senkronize tutmak için kullanışlıdır.
Görev
OrtaBir hava durumu izleme sistemi oluşturarak Gözlemci Desenini (Observer Pattern) uygulayın. Kodun belirtilen alanlarında iki sınıf oluşturmanız gerekmektedir.
Adım 1: WeatherStation sınıfını oluşturun
Yorum satırının belirttiği yere WeatherStation sınıfınızı yazın. Bu sınıf şunları yapmalıdır:
- Subject sınıfından miras almalıdır (
class WeatherStation(Subject):kullanın) - Şu şekilde başlatılmalıdır:
super().__init__()kullanarak üst sınıf kurucusunu çağırınself._temperatureözel özniteliğini kullanarak başlangıç sıcaklığını 0 olarak ayarlayın
<strong>set_temperature(self, temperature)</strong>metodunu uygulayın:- Özel sıcaklık özniteliğini güncelleyin
- Tüm gözlemcileri bilgilendirmek için
self.notify(self._temperature)metodunu çağırın
<strong>get_temperature(self)</strong>metodunu uygulayın:- Mevcut sıcaklık değerini döndürün
Adım 2: WeatherDisplay sınıfını oluşturun
Yorum satırının belirttiği yere WeatherDisplay sınıfınızı yazın. Bu sınıf şunları yapmalıdır:
- Observer sınıfından miras almalıdır (
class WeatherDisplay(Observer):kullanın) - Şu şekilde başlatılmalıdır:
- Bir
nameparametresi kabul etmelidir - İsmi
self.nameolarak saklamalıdır
- Bir
<strong>update(self, temperature)</strong>metodunu uygulayın:- Sıcaklık güncelleme mesajını aşağıda gösterilen tam formatta yazdırın
Mesaj Formatı:
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:
# Create weather station and displays
station = WeatherStation()
phone_display = WeatherDisplay("Phone")
tablet_display = WeatherDisplay("Tablet")
# Attach displays to station
station.attach(phone_display)
station.attach(tablet_display)
# Update temperature - both displays will be notified
station.set_temperature(25.5)
# Output:
# Display Phone: Current temperature is 25.5C
# Display Tablet: Current temperature is 25.5CÖnemli Notlar:
attach()vedetach()metodları Subject temel sınıfında zaten uygulanmıştır - bunları WeatherStation sınıfınızda uygulamanıza veya çağırmanıza gerek yoktur- Yukarıdaki örnek kullanımda,
station.attach(phone_display)WeatherStation uygulamanızın içinde değil, sınıfınızın kullanıcısı tarafından çağrılır - WeatherStation sınıfınızın sadece sıcaklık değiştiğinde
self.notify()metodunu çağırması yeterlidir - geri kalanını Subject temel sınıfı halleder - WeatherStation'da gerekli üç metodu ve WeatherDisplay'de yukarıda belirtilen iki metodu uygulamaya odaklanın
Kopya kağıdı
Gözlemci Deseni (Observer Pattern), bir nesnenin (konu/subject) durumu değiştiğinde birden fazla nesneyi (gözlemciler/observers) bilgilendirdiği bire-çok (one-to-many) bir ilişki oluşturur.
Gözlemcileri yöneten temel 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)update metoduna sahip Gözlemci sınıfları:
class EmailNotifier:
def update(self, message):
print(f"Email sent: {message}")
class SMSNotifier:
def update(self, message):
print(f"SMS sent: {message}")Gözlemci deseninin kullanımı:
# Create subject
news = Subject()
# Create observers
email = EmailNotifier()
sms = SMSNotifier()
# Add observers to subject
news.add_observer(email)
news.add_observer(sms)
# Notify all observers
news.notify("Breaking news: Python is awesome!")Hisse senedi fiyat takipçisi ile pratik bir örnek:
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}")Gözlemci Deseni, bir nesnenin bir şey değiştiğinde diğer birçok nesneyi otomatik olarak bilgilendirmesini sağlar. Konu (subject), gözlemcilerin bir listesini tutar ve gerektiğinde onların update metodunu çağırır.
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.
Object Oriented Programming 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ı