Menu
Coddy logo textTech

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 $155

Temel 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.

challenge icon

Görev

Orta

Bir 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 name parametresi kabul edin
    • Adı self.name olarak saklayın
  • Ş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() ve detach() 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

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 Python derleyicisi