CodeBlanks Logo Icon CodeBlanks

Observer

Observer desenini öğrenirsin.

Observer

Observer, bir nesnenin durum değişikliğini abonelere bildirmesini sağlar. Subject, aboneleri bir listede tutar; notify çağrıldığında her birine haber verir.

class Subject:
    def __init__(self):
        self._observers = []
    def subscribe(self, obs):
        self._observers.append(obs)
    def notify(self, value):
        for obs in self._observers:
            obs(value)

Aboneler çağrılabilirdir; bu, olay güdümlü arayüzlerde ve mesajlaşma sistemlerinde yaygındır.

abone ekleme ve bildirim

Abone eklemek için subscribe(obs) çağrılır; obs çağrılabilirdir (işlev veya __call__ yöntemi olan nesne). Bildirim, notify(value) ile yapılır.

def log_observer(value):
    print(f"log: {value}")

s = Subject()
s.subscribe(log_observer)
s.notify("merhaba")  # log: merhaba

Birden çok abone eklenebilir; hepsi aynı değeri alır. Bu, günlükleme, önbellek invalidasyonu ve UI güncellemeleri için uygundur.

Uygulama Observer ile günlükle

class Subject: tanımla. __init__ içinde self._observers = []. def subscribe(self, obs): metodu self._observers.append(obs) yapsın. def notify(self, value): metodu for obs in self._observers: obs(value) yapsın. def log_observer(value): işlevi print(f"log: {value}") yapsın. s = Subject() oluştur, s.subscribe(log_observer) ve s.notify("merhaba") çağrısı yap.

Başlangıç kodu

main.py
# Subject sınıfını tanımla (observers listesi, subscribe ve notify)
# log_observer işlevini tanımla (value'yu yazdırır)
# bir Subject oluştur, log_observer'ı abone ekle ve notify çağrısı yap

Örnek çözüm

main.py
class Subject:
    def __init__(self):
        self._observers = []
    def subscribe(self, obs):
        self._observers.append(obs)
    def notify(self, value):
        for obs in self._observers:
            obs(value)

def log_observer(value):
    print(f"log: {value}")

s = Subject()
s.subscribe(log_observer)
s.notify("merhaba")

Beklenen çıktı

log: merhaba

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Observer deseninde Subject aboneleri nerede tutar?

  • Bir kümede
  • Bir dosyada
  • Bir listede Doğru cevap
  • Bir veritabanında

Açıklama: Subject, aboneleri _observers listesinde tutar.

2 notify gövdesini tamamla

Soru
    def notify(self, value):
        for obs in self._observers:
            ____(value)
Cevap
    def notify(self, value):
        for obs in self._observers:
            obs(value)

Açıklama: obs(value) ile her abone çağrılır.

3 Observer kavramlarını eşleştir

Kavram Anlamı
Subject Bildirimi yapar
subscribe Abone ekler
notify Haber verir
obs(value) Aboneyi çağırır

İleri seviye bölümündeki tüm dersler