Observer pattern, nesneler arasındaki iletişimi yönetmeyi amaçlar. En temel anlamda bir nesnenin durumu değiştiğinde, değişikliği bu nesneyi gözlemleyen diğer nesnelere (gözlemcilere) ileten bir yapıdır.
Temel bileşenlerinden ise şöyle bahsedebiliriz;
- Subject (Konu): Durumunda bir değişiklik olduğunda gözlemcilere haber vermesi gereken nesnedir.
- Observer (Gözlemci): Konuyu (durumu değişen nesneyi) gözlemleyen ve durumdaki değişiklikleri takip eden nesnelerdir. Birden fazla gözlemci olabilir ve her biri durumdaki değişikliklerden haberdar edilir.
Patternin çalışma akışı ise:
- Bir konu nesnesi oluşturulur (Concrete Subject).
- Bir veya birden fazla gözlemci nesnesi oluşturulur (Concrete Observer).
- Gözlemciler, konuyu gözlemlemek istediklerini belirterek konuya kaydolurlar.
- Konu, durumunda bir değişiklik olduğunda kayıtlı gözlemcilere haber verir.
- Gözlemciler, konunun haber verdiği değişikliği alır ve uygun tepkiyi verir.
Örneğin, bir haber ajansının internet sitesini düşünelim. Haber ajansı, haberlerin yayınlandığı kaynak olarak konuyu temsil eder. İnternet sitesi ziyaretçileri ise gözlemcilerdir. Bir haber yayınlandığında, ajans haberin yayınlandığını belirtir ve internet sitesi ziyaretçileri haberdar olur, bu sayede kodun daha modüler ve esnek olmasını sağlamak amaçlanır. Günün sonunda konunun durumu değiştiğinde sadece ilgili gözlemcilere haber verilir, böylece gereksiz bağımlılıklar ve karmaşıklıklar azaltılır. Bu da yazılımın sürdürülebilirliğini artırır, yönetim, bakım ve geliştirme maliyetini düşürür.
Örnek bir senaryo üzerinden giderek kodlayalım, Bir haber portalı abone sistemi düşünün. Haber portalına kayıt olan kullanıcılar, yeni haberler yayınlandığında e-posta yoluyla bilgilendirilecekleri bir sistemimiz olduğunu hayal edelim.
from abc import ABC, abstractmethod
class NewsSubject(ABC):
@abstractmethod
def register_observer(self, observer):
pass
@abstractmethod
def remove_observer(self, observer):
pass
@abstractmethod
def notify_observers(self):
pass
class Observer(ABC):
@abstractmethod
def update(self, news):
pass
class NewsPortal(NewsSubject):
def __init__(self):
self._subscribers = []
self._latest_news = ""
def register_observer(self, observer):
self._subscribers.append(observer)
def remove_observer(self, observer):
self._subscribers.remove(observer)
def notify_observers(self):
for subscriber in self._subscribers:
subscriber.update(self._latest_news)
def publish_news(self, news):
self._latest_news = news
self.notify_observers()
class Subscriber(Observer):
def __init__(self, name):
self._name = name
def update(self, news):
print(f"{self._name} adlı abone, yeni haber aldı: {news}")
news_portal = NewsPortal()
subscriber1 = Subscriber("Ali")
subscriber2 = Subscriber("Veli")
subscriber3 = Subscriber("Ahmet")
news_portal.register_observer(subscriber1)
news_portal.register_observer(subscriber2)
news_portal.register_observer(subscriber3)
news_portal.publish_news("Yeni teknoloji gelişmeleri!")
news_portal.remove_observer(subscriber2)
news_portal.publish_news("Dünya genelinde php kullanmak yasaklandı!")
-----------------------------------------------------------------------
Ali adlı abone, yeni haber aldı: Yeni teknoloji gelişmeleri!
Veli adlı abone, yeni haber aldı: Yeni teknoloji gelişmeleri!
Ahmet adlı abone, yeni haber aldı: Yeni teknoloji gelişmeleri!
Ali adlı abone, yeni haber aldı: Dünya genelinde php kullanmak yasaklandı!
Ahmet adlı abone, yeni haber aldı: Dünya genelinde php kullanmak yasaklandı!
Haber portalı (konu) üzerinde aboneler (gözlemciler) kayıtlıdır. Haber portalı yeni bir haber yayınladığında, kayıtlı abonelere haber gönderir ve aboneler bu habere uygun şekilde tepki verir.
Gerçek hayat senaryolarında da sıklıkla karşılaştığımız ve kullandığımız observer patterni mvc patternde modeli subject, viewı ise subscriber rolüyle görürüz, yine djangoda inbuilt yer alan signals ile observer patterne uygun temiz yapılar oluşturabiliriz, signals ile bir kullanıcı sisteme kaydolduğunda, profilinin otomatik oluşmasını, hoşgeldin maili atılmasını sağlayabiliriz.
Be First to Comment