Bir konsol uygulaması projesi oluşturduktan sonra, Arayüzlerimizi kodlayalım:
public interface ISubject
{
void Register(IObserver observer);
void UnRegister(IObserver observer);
void PushMessage(string message);
}
public interface IObserver
{
void ShowUpdate(string message);
}
Arayüzlerden görüleceği üzere, ISubject arayüzünden türetilen nesnenin 3 görevi olacak: Verilen bir IObserver’ı listeye kaydetmek, Verilen bir IObserver’ı listeden çıkarmak, Mesaj yayınlamak. IObserver’ın ise tek görevi metin olarak iletilen güncellemeleri görüntülemek olacak. Şimdi somut Konu sınıfımızı kodlayalım:
public class Subject : ISubject
{
public List<IObserver> Observers = new List<IObserver>();
public void Register(IObserver observer)
{
Observers.Add(observer);
}
public void UnRegister(IObserver observer)
{
Observers.Remove(observer);
}
public void PushMessage(string message)
{
foreach (IObserver observer in Observers)
{
observer.ShowUpdate(message);
}
}
}
Somut sınıfımız, arayüzdeki metotların yanı sıra bir de liste içeriyor. Bu listede Gözlemleyici’lerimizi tutacağız. PushMessage adlı metodun gövdesinde, listedeki tüm Gözlemleyici’lerin tek tek ShowUpdate metotlarının çalıştırıldığını görüyoruz. Şimdi de somut Observer sınıfını kodlayalım:
public class Observer : IObserver
{
private string Name;
public Observer(string name)
{
Name = name;
}
public void ShowUpdate(string message)
{
Console.WriteLine(“Update from the {0} : {1}”, Name, message);
}
}
Somut Observer sınıfı oluşturulurken name adında bir metin istiyor ve bu metni Yapıcı Metodu aracılığıyla Name adlı değişkenine atıyor. ShowUpdate metodu ise kendisine iletilen metni konsola yazıyor. Şimdi, programımızın ana bloğunu yazalım:
private static void Main(string[] args)
{
//Gözlemleyiciler oluşturulur
Observer ob1 = new Observer(“Observer 01”);
Observer ob2 = new Observer(“Observer 02”);
Observer ob3 = new Observer(“Observer 03”);
//Konu oluşturulur
Subject subject = new Subject();
//Gözlemleyiciler, Konu’ya kaydedilir
subject.Register(ob1);
subject.Register(ob2);
subject.Register(ob3);
//Konu nesnesi bir mesaj yayınlar
subject.PushMessage(“hello world”);
//Gözlemleyiciler’den biri Konu’dan çıkarılır
subject.UnRegister(ob3);
//Konu nesnesi bir mesaj yayınlar
subject.PushMessage(“hello world again”);
Console.ReadKey();
}
Çıktı şu şekilde olacaktır:
Update from the Observer 01 : hello world
Update from the Observer 02 : hello world
Update from the Observer 03 : hello world
Update from the Observer 01 : hello world again
Update from the Observer 02 : hello world again
Observer tasarım deseninin basit bir implementasyonunu yapmış olduk. Bu tasarım deseni, bir objenin, bir diğer objenin içeriğinde değişiklik yapmasını sağlarken, aradaki bağlantıyı gevşek tutma(Loose Coupling) konusunda bir çözüm sağlamaktadır. Daha önce de belirttiğim üzere, Event Handling mekanizmaları Observer’a benzer bir mantıkla çalışırlar. MVC mimari deseni de observer’a bir örnektir. Klasik MVC’de Model-View soyutlaması, observer tasarım deseniyle sağlanmaktadır.