C# Observer Design Pattern(Observer Tasarım Deseni)

Merhaba,

Bu yazımızda Behavioral Patterns(Davranışsal Kalıplar) kategorisine giren Observer Design Pattern üzerine konuşacağız.

Observer adı üzerinde gözlemci, izleyici, gözcü yahut gözetmen diye nitelendirilen, anlamı gibi işlev gören bir tasarım desenidir. Elimizdeki mevcut nesnenin durumunda herhangi bir değişiklik olduğunda, bu değişiklerden diğer nesneleri haberdar eden bir tasarımdan bahsediyoruz. Dahada net bir şekilde bahsetmek gerekirse, elimizdeki “x” nesnesinin “y” özelliğinde bir güncellenme, değişiklik yahut belirli bir şartın gerçekleşmesi gibi bir durum cereyan ettiğinde bu “x” nesnesini -izleyen- -gözleyen- diğer “z”, “w”, “k” vs. nesnelerine bu yeni durumu bildiren sisteme Observer tasarım deseni diyoruz.

Şimdi Observer Design Pattern için teorik olarak örnek olay ele alalım.

Elimizde bir Öğrenci nesnesi olsun. Bu Öğrenciyi takip eden; Anne, Baba ve Öğretmen nesneleri olsun. Okul, Öğrenci dersi astığı zaman onu takip eden Annesine, Babasına ve Öğretmenine direkt olarak bu durumu haber veriyor olsun.

İşte bu yukarıda gördüğünüz örnek olay tam tamına Observer tasarım desenine uygun bir örnektir. İnternet ve diğer kaynaklara göz atarsanız eğer konuyla alakalı “Subject”, “Observer” ve “Concrete” terimleriyle karşılaşacaksınız. Şimdi bu terimlerimizi yukarıdaki örnek olay üzerinden ilişki kurarak açıklayalım ve bu esnada Observer Design Pattern’in örnek olayımızdaki rolünü tam olarak net bir şekilde izah edelim.

Observer Design Pattern’de;

  • Subject
    Takip edilecek nesneyi Subject terimiyle ifade etmekteyiz. Yukarıdaki örnek olayda Öğrenci nesnesi bizim Subject’timiz olmaktadır.
  • Observer
    Subject’i takip edecek olan aboneler tek tip olmayabilirler. Yukarıdaki örnek olayımızda Subject’i, hem Ana, hem Baba hemde Öğretmen nesneleri takip etmektedirler. İşte böyle bir durumda birden fazla tipe arayüz görevi görecek abstract yahut interface yapımıza Observer denmektedir. Anlayacağınız örnek olayımızda Öğrenci nesnemizi takip edenlerin birden fazla tip olmasını sağlayan o sistem Observer arayüzüdür.
  • Concrete
    Subject’i takip eden nesnelerdir. Yukarıdaki örnek olayımızda; Anne, Baba ve Öğretmen nesneleri Concrete nesneleridir.

İşte Observer Design Pattern yapısınıda Öğrencinin dersi asdığı anda diğer abonelere haber veren Okul’a benzetebiliriz. Yani bir sistemdir diyebiliriz.

Şimdi teknik olarak Observer Design Pattern’i incelemeye başlayabiliriz.
Öncelikle UML Diagramına bir göz atalım.
C# Observer Design Pattern(Observer Tasarım Deseni)

Diyagramda gördüğünüz gibi Subject(Hedef) olarak belirtilen nesnemize Observer’lar(Gözlemciler) subscribe yani abone olmuşlardır. Subject nesnemiz içerisinde herhangi bir “y” özelliği güncellendiğinde Notify metodu tetiklenecek ve bu metod Subject’e abone olan tüm Observer’ların Update metodunu çalıştıracaktır.

Hadi gelin bu diyagram mantığında yukarıdaki örnek olayı pratikleştirelim.

Öncelikle Subject’imize(yani hedefimize) bir çok tipin abone olabilmesini sağlayacak Observer arayüzünü geliştirelim.

	abstract public class Observer
	{
		public abstract void Update();
	}

Observer arayüzünü ben abstract class olarak belirledim. Siz isterseniz interface olarak çalışabilirsiniz. Observer sınıfından kalıtım alan her abone sınıfa Update metodu uygulanacaktır. Haliyle Subject’imizde ilgili alan değiştiğinde abonelerimizdeki Update metodu tetiklenecektir.

Şimdi Concrete nesnelerimizi başka bir deyişle takip edecek sınıflarımızı oluşturalım.

	public class BabaObserver: Observer
	{
		public override void Update()
		{
			Console.WriteLine("Öğrencinin kaçtığından babasının haberi oldu.");
		}
	}
	public class AnneObserver: Observer
	{
		public override void Update()
		{
			Console.WriteLine("Öğrencinin kaçtığından anasının haberi oldu.");
		}
	}
	public class OgretmenObserver: Observer
	{
		public override void Update()
		{
			Console.WriteLine("Öğrencinin kaçtığından öğretmenin haberi oldu.");
		}
	}

Tabi bu sınıflara kendilerine özgü işlev yapacak başka elemanlar eklenebilirler. Lakin biz makalemizde öze olan eğilimimizden dolayı sade bir örneklendirme üzerinden gidiyoruz.

Şimdide Subject’imizi yani takip edilecek nesnemizi inşa edelim.

	public class Ogrenci
	{
		public string Adi { get; set; }
		public string SoyAdi { get; set; }
		public string Memleket { get; set; }
		public int Sinif { get; set; }
		
		bool dersiAstiMi;
		//Bu property Observer D. P.'de değeri kontrol edilen özelliğimizdir.
		//set bloğuna dikkat edersek eğer set edilen değer true ise
		//Notify metodu tetiklenmekte ve tüm abonelere haber gönderilmektedir.
		public bool DersiAstiMi {
			get { return dersiAstiMi; }
			set {
				if (value = true) {
					Notify();
					dersiAstiMi = value;
				}else
					dersiAstiMi = value;
			}
		}
		//Subject nesnesi kendisine abone olan gözlemcileri bu koleksiyonda tutacaktır.
		List<Observer> Gozlemciler ;
		public Ogrenci()
		{
			this.Gozlemciler = new List<Observer>();
		}
		//Gözlemci ekle
		public void AboneEkle(Observer observer){
			Gozlemciler.Add(observer);
		}
		//Gözlemci çıkar
		public void AboneCikar(Observer observer){
			Gozlemciler.Remove(observer);
		}
		//Herhangi bir güncelleme olursa ilgili gözlemcilere haber verecek metodumuzdur.
		public void Notify(){
			Gozlemciler.ForEach(g=>
			                    {
			                    	g.Update();
			                    });
		}
	}

Ve son olarak tasarımımızı test edelim.

	class Program
	{
		public static void Main(string[] args)
		{
			
			Ogrenci o = new Ogrenci();
			o.AboneEkle(new BabaObserver());
			o.AboneEkle(new AnneObserver());
			o.AboneEkle(new OgretmenObserver());
			
			o.Adi = "Gençay";
			o.SoyAdi = "Yıldız";
			o.Memleket = "Artvin";
			o.Sinif = 24;
			o.DersiAstiMi = true;
			
			Console.ReadKey(true);
		}
	}

DersiAstiMi propertysine “true” değerini set ettiği satırdan sonra aşağıdaki ekran görüntüsündeki sonucu almaktayız.
C# Observer Design Pattern(Observer Tasarım Deseni)

Bir Design Pattern makalesininde sonuna gelmiş bulunmaktayız. Konumuzu noktalamadan önce delegate – event yapıları arasındaki ilişki ile Observer tasarım şablonundaki subject ve aboneler arasındaki ilişkilerin ne kadar paralel mantıkta olduğunu vurgulamak istiyorum.

Okuduğunuz için teşekkür ederim…

Sonraki yazılarımda görüşmek üzere…

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. Selçuk dedi ki:

    Diğer sitelerde bakıp da anlamakta zorlandığım bu konuyu çok sade ve anlaşılabilir bir şekilde anlattığınız için teşekkür ederim elinize , emeğinize sağlık

  2. Engin dedi ki:

    kesinlikle Selçuk beyin yorumuna katılıyorum. Çok yalın ve basit anlatmışsınız teşekkür ederim, emeğinize sağlık.

  1. 08 Nisan 2018

    […] Observable modelinin tasarımsal yapısıyla alakalıdır. Bu mantığı daha da anlayabilmek için Observer Design Pattern konusuna göz atabilirsiniz. Yapısal olarak bu tasarım, belirli olayları takip etmekte ve tepki […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.