Observer Design Pattern Nedir ?

Fatih İzgi
Kodcular
Published in
3 min readJun 26, 2023

Design Patterns eğitim serisindeki ilk yazımızda, tasarım desenlerinin “Yazılımcıların sıklıkla karşılaştığı problemlere ve yazılımların doğasında bulunan genel ihtiyaçlara getirilen çözümler” olduğunu söylemiştik. Sık karşılaşılan problemlerden bir tanesi ise; bir nesnenin durumunun, bağlı olduğu başka bir nesneye göre güncellenmesi ihtiyacıdır. Bu yazımızda, bu problemi çözmek için kullanabileceğimiz Observer Design Pattern yapısını inceleyeceğiz.

Konuya başlamadan önce problemin ne olduğunu biraz analiz edelim :

Pek çok online dizi/film izleme platformunda bildirim gönderme seçeneği mevcuttur. İzlediğiniz dizinin sezon finali yaptığını ve yeni bölüm yüklendiğinde bildirim almak istediğinizi varsayalım. Bu durumda sürekli olarak siteye girerek yeni bölüm yüklenip yüklenmediğini kontrol edebilirsiniz ancak bu sizin için gereksiz uğraştırıcı bir iş olacaktır. Ayrıca, bu kontroller sırasında yeni bölümün yüklendiğini çok sonradan da görüyor olabilirsiniz. Daha kritik başka bir örnek inceleyecek olursak;

Bir para birikim uygulaması kullandığınızı varsayalım. Ayrıca uygulama, paranızı Dolar endeksli, Euro endeksli vs. olarak biriktirmenize imkan sunuyor olsun. Bu durumda, kurdaki değişimlerin mutlaka anlık olarak o kura endeksli olan tüm hesaplara yansıması gerekmektedir. Eğer tüm hesaplar bağlı olduğu kurdaki değişimleri sürekli olarak takip etmek zorunda kalırsa performans açısından oldukça sıkıntılı bir durum ortaya çıkacaktır. Eğer bunun önüne geçmek için belirli aralıklarla kur kontrolü yapılırsa da hesaplamada yanlışlıklar olacaktır. Bu sebeple hem performans problemlerini engelleyecek hem de anlık değişimleri yakalayabilecek bir tasarım ortaya konulmalıdır.

Observer Design Patter, aralarında one-to-many ilişki bulunan ve nesneler arası bağımlılıkların söz konusu olduğu durumlarda, bağımlı nesnelerin bağlı olunan nesnenin durumuna göre güncellenebilmesi/haberdar olabilmesi amacı ile kullanılır. Bu durumda bağımlı olunan(takip edilen, abone olunan) nesne Subject; bağımlı olan(abone) nesne ise Observer olarak isimlendirilir. Davranışsal(Behavioral) tasarım desenlerinden biridir ve kullanılması ile birlikte performans düşüşünün engellenmesi, hata yapma riskinin azaltılması gibi avantajlar elde edilir.

Öncelikle problemimizi yazılıma aktarmak adına örnek bir yapı oluşturalım :

Öncelikle, kur endeksli birikim nesnelerimizin şablonunu belirlediğimiz CurrencyBasedSaving isimli bir soyut sınıf oluşturduk. Bu sınıfta, kendisine bağımlı olan Client nesneleri bir liste olarak tutulmaktadır. Temelde listeyi güncellemekle sorumlu, nesnelerin abone olmasını ve aboneliği sonlandırmasını sağlayan register() ve unRegister() metotlarını da ekledik. Ayrıca sınıfta, kurun o anki güncel TL karşılığını tutan exchangeRate değişkeni bulunmaktadır. Aslında diğer nesnelerin bu sınıftan türeyecek olan nesnelere bağımlı olmasının sebebi de bu değişkendir. exchangeRate durumunun değişmesi, yani setExchangeRate() metodunun çağırılması ile tüm müşterilerin hesabında değişim yapan updateStatesOfClient() metodu çalışır. Böylece, anlık olarak tüm hesaplardaki para miktarı kur değişimine göre güncellenir.

Müşterilerin durumunu inceleyecek olursak :

Client sınıfı, hangi kura endeksli olacağının bilgisini tutan currencyBasedSaving nesnesine sahiptir. Görüldüğü üzere, constructor metodunda bu nesneye direkt olarak abone olur. Bu sayede, bağlı olduğu kurdaki değişimler ile birlikte kendisi de güncellenir. Ayrıca müşterinin sahip olduğu toplam tutarın TL karşılığını ve döviz kuru karşılığını tutan totalSaving ve totalCurrencySaving değişkenlerine de sahiptir.

Döviz kurlarındaki (Subject nesnedeki) değişimin, müşteri hesaplarındaki (Observer nesneler üzerindeki) etkisini inceleyecek olursak :

Output:

Dolar Endeksli Birikim

Toplam Birikim : 200.0

Dolar Endeksli Birikim

Toplam Birikim : 400.0

Görüldüğü gibi, dolar kurundaki değişime göre müşterilerin hesaplarındaki tutar anlık olarak güncellenmektedir. Ayrıca, Euro kurundaki değişimin dolar endeksli hesaplarda etkisiz olduğuna dikkat ediniz. Bu durumu ilk örnek üzerinden yorumlayacak olursak;

İzleyici, tüm dizi/film platformuna abone olmak zorunda değildir. Yani tüm içerikler ile ilgili bildirim almaz, yalnızca belirli diziler için bildirim alır. Böylece gereksiz yere rahatsız edilmez.

TÜM YAPI

Observer Design Pattern konusunun ayrıntılarını ve inceliklerini öğrendiğimize göre tüm yapıyı incelemeye başlayabiliriz :

Yararlandığım Kaynaklar :

1- DigitalOcean

2- Tutarialspoint

3- Refactoring.Guru

--

--