Observer Design Pattern

Observer Design Pattern (Gözlemci Tasarım Deseni), iki ana bileşenden oluşur; Subject ve Observer…

Subject, üzerinde değişimlerin gözlendiği, gözlenmek istendiği bileşendir. Observer ise bir subject’teki değişimleri gözlemlemek için kullanılan bileşendir.

Observer Design Pattern’da, bir subject’teki değişimden, onu gözleyenler haberdar edilir.

Observer Pattern’ı bir başarımlar sistemi kurmak için kullanabiliriz. Buna yönelik bir senaryo belirleyip, bu senaryoyu Observer Design Pattern kullanarak çözelim.

Senaryo

Oyunumuzda bir skor verisi olduğunu düşünelim. Bu skor verisindeki değişiklikleri gözleyen 3 adet de başarımımız olsun. Başarımlarımız kendi hedef skorlarına geldiklerinde açılsınlar ve başarılmış olsunlar.

Adım 1

ScoreDataSubject isimli bir nesne oluşturalım. Bu nesne, dinleyeceğimiz nesne. Bütün observer’larımız, bu nesneye kayıt olup, bu nesnedeki değişimleri dinleyecekler.

ScoreDataSubject

ScoreDataSubject nesnemiz, score datamızı ve kendini dinleyen observer’ların listesini tutuyor. Bu subject’teki değişimleri dinlemek isteyen observer’lar Attach() metodunu kullanarak kendilerini bu nesneye kaydediyorlar. Detach() metodunu kullanan observerlar da kendilerini gözlemciler listesinden silmiş oluyorlar. Notify() metoduna gelecek olursak, bu metod da subject’teki değişimlerin observer listesindeki her bir elemana gönderilmesini sağlıyor.

Kurduğumuz sistemde, SetScore() metodu çağrıldığında, yani her yeni skor set edildiğinde, ScoreDataSubject’e kaydolmuş bütün observer’lar bu skordan haberdar olacaklar.

Adım 2

Bu adımda da ScoreDataObserver’ımızı yazalım. Pattern’ımızdaki diğer tüm observer’lar bu sınıftan türetilecek.

ScoreDataObserver

Her observer constructor’ında kendini dinleyeceği subject’e kaydediyor. Böylece ondaki bütün değişimleri takip etmiş oluyor.

Adım 3

Bu adımda da Achievement(Başarım) nesnemizi oluşturalım ve ardından belirleyeceğimiz 3 başarımı Achievement base sınıfından türetelim. Bu üç başarımımız şunlar olacaklar; BabySteps, SuperScorer ve ImmortalPlayer…

Achievement

 

Dikkatinizi OnNotify() metoduna çekmek istiyorum. OnNotify() metodu her çağrıldığında biliyoruz ki subject’te bir değişiklik var. Biz burada subject’teki skor değişimini dinliyoruz ve başarımımızın hedefinden büyük mü, kontrol ediyoruz. Eğer skor, hedef değerimizden büyükse, Achieve() metodunu çağırıyoruz ve başarımımızı gerçekliyoruz. Ardından artık skor datasını dinlemeye ihtiyacımız olmadığı için, Achievement gözlemci nesnemizi gözlemlediğimiz subject’ten Detach() metodunu kullanarak koparıyoruz.

BabySteps

SuperScorer

ImmortalPlayer

Adım 4

Demomuzu yazalım ve senaryomuzu gerçeklemiş olalım.

Demomuzun Start metodu içinde başarımlarımızı yarattık ve ardından IncreaseScore Coroutine’ini başlattık. IncreaseScore() coroutine’i skoru her yarım saniyede bir artırıyor ve skordaki değişim bütün observerlara bildiriliyor. Başarılan başarımlar kendilerini kaydoldukları subject’ten koparıyor ve en sonunda skoru dinleyen hiç başarım kalmıyor. Ve böylece senaryomuzu gerçeklemiş oluyoruz.

Eğer bu çalışmam işinize yaramışsa ve daha fazla çalışma yapmam için destek olmak isterseniz, bana bir kahve ısmarlayın lütfen 🙂

Saygılar.