Menu
Coddy logo textTech

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

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

challenge icon

Görev

Orta

Bir 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ın
    • self._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 name parametresi kabul etmelidir
    • İsmi self.name olarak saklamalıdır
  • <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() ve detach() 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

quiz iconKendini test et

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