Genel

Observer Pattern Nedir ?

Herkese Merhaba,

Bu dersimizde Design Pattern konularından observer pattern ‘i öğreneceğiz. Meşhur Dörtlü Çetenin oluşturduğu tasarım desenlerinin ne olduğu ile ilgili bilgi için aşağıdaki adresi inceleyebilirsiniz.

//tr.wikipedia.org/wiki/Tasar%C4%B1m_%C3%B6r%C3%BCnt%C3%BCleri

Konumuz bu değil. Ondan çok üstünde durmayacağım. Şimdi Gözetleyici (Observer) Pattern için basit bir örnek ile açıklayalım. Abonelik sistemleri vs örnek olabilir. Sosyal medyada arkadaşlarımızn bildirimlerini almamız yada indirimli ürünleri gördüğümüz sistemler bu tasarım desenini kullanıyor diyebiliriz. Aslında tek bir sistem var ve bunu gözlemleyenler var. Böyle bir yapıda bu pattern ‘i kullanıyoruz.

Observer tasarım deseni, bir nesnede meydana gelen değişikliği içinde bulunduğu listedeki tüm elemanlara bildiren tasarım desenidir.

Behavioral (Davranışsal) Tasarım deseni altında işlenir.

Örneğimiz şu olsun. Bir bildirim sistemi kuralım. Üyelerimiz bu sisteme kayıt olabilir ya da bildirim almalarını durdurabilirler. Bildirim ‘i mesaj olarak ‘ta alabilirler, notification olarakta. Nasıl yapacağız, inceleyelim.

Öncelikle şu kavramları bilmeliyiz.

  • Observer: Değişimden etkilenecek, izleyecek olan sınıfların uyguladığı arayüzdür. Misal Kullanıcı, Abone sinifları
  • Observable: Takip edilecek olan yapımızdır. İçerisinde Observer (değişimden etkilenecek) nesneleri tutar. Yazmış olduğumuz sistemin katılım alacağı, gözlemleyici.

Hadi Kodlayalım.

// Observer ! Değişimden etkilenecek kişidir.
 interface IAbone {
    fun mesajAl(message: String)
}
// Takip edilecek olan yapımızdır.
// İçerisinde Observer (değişimden etkilenecek) nesneleri tutar. Observable'a denk gelir
interface IMessageSystem {
   fun addUser(kullanici: Kullanici)
   fun removeUser(kullanici: Kullanici)
   fun sendMessage(message: String)
}
class Kullanici : IAbone {
    override fun mesajAl(message: String) {
        println(message)
    }
}
class Notification : IMessageSystem {

    private val kullanicilar : MutableList<IAbone>

    init {
        kullanicilar = ArrayList()
    }

    override fun addUser(kullanici: Kullanici) {

        kullanicilar.add(kullanici)
    }

    override fun removeUser(kullanici: Kullanici) {
        kullanicilar.remove(kullanici)
    }

    override fun sendMessage(message: String) {
        kullanicilar.indices.forEach {
            kullanicilar[it].mesajAl(message)
        }
    }


}

class Sms : IMessageSystem{
    var kullanicilar : MutableList<Kullanici> = ArrayList()

    override fun addUser(kullanici: Kullanici) {
        kullanicilar.add(kullanici)
    }

    override fun removeUser(kullanici: Kullanici) {
        kullanicilar.remove(kullanici)
    }

    override fun sendMessage(message: String) {
        kullanicilar.indices.forEach {
            kullanicilar[it].mesajAl(message)
        }
    }

}
fun main() {

    val omer = Kullanici()
    val nisa = Kullanici()
    val baris = Kullanici()
    val ayse = Kullanici()

    val notification = Notification()


    notification.addUser(omer)
    notification.addUser(nisa)
    notification.addUser(ayse)
    notification.addUser(baris)

    notification.sendMessage("Bu bir Notification Bildirimidir.")

    notification.removeUser(nisa)
    notification.removeUser(ayse)

    notification.sendMessage("Bu bir Notification Bildirimidir.")
    val sms = Sms()
    sms.addUser(ayse)
    sms.addUser(nisa)
    sms.sendMessage("Bu Bir sms yayınıdır.")

}

Şimdi neler yaptık ?

1 -> Kendimizi observer yani değişimden etkilenecek kişi olarak düşünün. Biz sisteme giriş yaptıktan sonra Observable bizi izliyor. Bu da Kullanici ile IAbone ‘ye karşılık geliyor.

2 -> Observable yani bizim hareketlerimizi gözlemleyen sistem. Biz sistemde istediğimizi yapabiliriz. Abone oluruz ya da abonelikten çıkabiliriz. IMessageSystem interface ‘i ve altındaki SMS ile Notification sınıfları buna karşılık geliyor.

3 -> Main class ‘ta normal nesnelerimizi çağırıp, işlem yaptığımız test sınıfıdır.

Umarım faydalı olmuştur.

Aşağıdaki adresten uygulama kodlarına erişebilirsiniz.

//github.com/umiitkose/DesignPattern/tree/master/observerpattern

Kaynakça :

PDF Olarak Özcan AKIN Hocamızın kitabını indirebilirsiniz. link

2 thoughts on “Observer Pattern Nedir ?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir