Observer Tasarım Deseni

Observer(Gözlemleyici) tasarım deseni, Subject(Konu) adlı bir sınıf ve bu sınıfa çalışma zamanında kayıt olan, Observer(Gözlemleyici) adını verdiğimiz sınıflardan oluşur. Konu’da bulunan bir metot üzerinden, Gözlemleyiciler’in bir aksiyonda bulunması veya içeriklerinin değiştirilmesi sağlanır. Gözlemleyici Tasarım Deseni, çalışma biçimi itibariyle, Event Handler(Olay Yakalayıcı)lara benzer. Bu tasarım deseni; Konu ve Gözlemleyici’yle birlikte, Konu ve Gözlemleyici’nin türetildiği birer soyut sınıf veya arayüzden oluşmaktadır.

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.

Bunlarda ilginizi çekebilir

Bir yanıt yazın

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