C#'ta Observer Design Pattern

C#'ta Observer Design Pattern kullanımı

Observer Design Pattern Varolan bir nesnenin durumunda meydana gelebilecek değişimler ve bu değişimle ilgilenen diğer nesneler arasındaki ilişkileri inceler.

Behavioral Patterns gurubu içerisinde yer alır. Baş aktörler Nesne ve Gözlemleyicilerdir.

Nesne ile Gözlemleyiciler arasında bire çok ilişki vardır. Bir nesne ve bir yada birden çok gözlemleyici.

Kullanım ihtiyacı konusunda ne tür örnekler verebiliriz ?

  • Yayıncı / Abone yapıları
  • Bir ürünün stok, fiyat, miktar durumlarında meydana gelebilecek değişimler ve bu değişimleri takip eden gözlemleyiciler.
  • Haber kaynaklarındaki değişimler son dakika haberleri ve bunları takip eden gözlemleyiciler. Blog yada RSS kanalları üzerinden içerik nesnesi durumunda meydana gelen bir değişim yeni içerik ekleme, içerik güncelleme ve bunu takip eden gözlemleyiciler.
  • MVC ve Event Yapıları gibi...

Observer Design Pattern çok sık bir kullanım oranına sahiptir.

Biz örneğimizde hava durumu ve hava durumundan haberdar olmak isteyen gözlemleyicileri konumuz ile ilişkilendirmeye çalışacağız.

Subject: Durumu gözlemlenecek nesnemiz.

Observer: ConcreteObserver'lar tarafından uygulanacak bir interface veya abstract class. Concrete Observer nesnelerinin ortak şablonu.

ConcreteObserver: Subject durumunda bir değişim olduğunda durumdan haberdar edilecek gözlemleyiciler.

Subject içerisinde Attach ile yeni ConcreteObserver kaydı, Detach ile kayıtlı ConcreteObserver kayıt silinme işlemi,

Notify ile tüm kayıtlı ConcreteObserver'lara nesne durumunda meydana gelen değişim haberi ve değişen nesnenin bir kopyası gönderimi sağlanmaktadır.

using System;

using System.Collections.Generic; using System.Linq;

using System.Text;


namespace ConsoleApplication1

{

//Subject

public class HavaDurumuRaporu

{

private DateTime sonGuncelleme; public DateTime SonGuncelleme

{


get

{


}

set

{



}

}



return sonGuncelleme;



sonGuncelleme = value; GozlemleyicileriUyar();



public string Durum { get; set; } public int Sicaklik { get; set; } public int Ruzgar { get; set; }

public string RuzgarYonu { get; set; } private List<IGozlemleyici> gozlemleyiciler;

public HavaDurumuRaporu()

{

gozlemleyiciler = new List<IGozlemleyici>();

}


public void GozlemleyiciEkle(IGozlemleyici gozlemleyici)

{

gozlemleyiciler.Add(gozlemleyici);

}


public void GozlemleyiciSil(IGozlemleyici gozlemleyici)

{

gozlemleyiciler.Remove(gozlemleyici);

}


private void GozlemleyicileriUyar()

{

foreach (IGozlemleyici gozlemleyici in gozlemleyiciler)

{

gozlemleyici.Guncelle(this);

}

}

}


//Observer

public interface IGozlemleyici

{

void Guncelle(HavaDurumuRaporu havaDurumu);

}


//Concrete Observer

public class Gozlemleyici : IGozlemleyici

{

public void Guncelle(HavaDurumuRaporu havaDurumuRaporu)

{

Console.WriteLine("Yeni hava durumu yayınlandı yayın tarihi/saati " + havaDurumuRaporu.SonGuncelleme.ToString());

}


public string Kimlik { get; set; }

}


class Program

{

static void Main()

{


HavaDurumuRaporu rapor = new HavaDurumuRaporu();


Gozlemleyici g1 = new Gozlemleyici { Kimlik = "ABC Denizcilik"

};

rapor.GozlemleyiciEkle(g1);


Gozlemleyici g2 = new Gozlemleyici { Kimlik = "DEF Yat Limanı"

};

rapor.GozlemleyiciEkle(g2);


rapor.Durum = "Parçalı Bulutlu"; rapor.Ruzgar = 3; rapor.RuzgarYonu = "Lodos"; rapor.Sicaklik = 25;

Console.WriteLine("Nesne Hava Durumu Yayınlıyor..."); rapor.SonGuncelleme = DateTime.Now;


Console.ReadLine();

}

}

}

Ekran Çıktısı

Nesne Hava Durumu Yayınlıyor...

Yeni hava durumu yayınlandı yayın tarihi/saati 20.03.2010 11:53:20 Yeni hava durumu yayınlandı yayın tarihi/saati 20.03.2010 11:53:20

İlk olarak nesnemizi (Subject) tanımladık. HavaDurumRaporu içerisine hava durumunda yer alan property'leri ekledik. Bu özelliklerden SonGuncelleme property set bloğunda GozlemleyicileriUyar() metodunu çağırdık. Nesnenin Son Guncelleme zamanında bir değişim olduğunda gözlemleyicilere bildiren yapı. Değişim olduğunda GozlemleyicileriUyar() metodunu çağırarak tüm gözlemleyicileri dolaşıp Guncelle metotlarını çağırmaktadır.

Yukarıdaki UML şemasındaki Notify fonksiyonu. Gozlemleyicileri gozlemleyiciler generic list yapısında tutup GozlemciEkle ve GozlemciSil metodları ile ekleme çıkarma yaptık. UML şemasındaki Attach, Detach fonksiyonları.

Client yapısında bir HavaDurumuRaporu nesnesi oluşturuldu. 2 gözlemleyici eklendi. Nesnenin SonGuncelleme zamanı yani durumu değişti. Tanımlı tüm Concrete Observer yapılarının Guncelle() metodu çağrılarak bu değişimden haberdar edildi.

Ozan Dalbudak
Merhaba,1995 doğumluyum. 2009 yılında lisede veritabanı Programcılığı bölümünü kazanarak kariyerime başlamış oldum. Daha sonra Selçuk Üniversitesi'nde Bilgisayar Mühendisliği okuyorum.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git