Gözlemci (Observer) Tasarım Deseni

Nov 20 2011 Published by under software development

Observer (gözlemci) tasarım deseni, içerisinde bir nesne ve o nesnenin bağımlılıklarını güncelleyen ve tüm durum değişikliklerini o nesneye haber veren bir gözlemci bulunduran bir yazılım tasarım desenidir. Gözlemci deseninde bir nesnenin durumu değiştiğinde diğer nesnelere haber verilir ve haberi alan nesneler kendilerini günceller. Bu desen şu durumlarda kullanılır:

  1. Bir nesneyi değiştirdiğinizde birden fazla nesnenin değişmesi gerekliyse ve kaç tane nesnenin değişeceğinden habersizseniz.
  2. Eğer bir soyutlamanın birbirine bağlı iki görünümü varsa ve bu sınıfları birden fazla sınıfa ayırmak sonradan kullanımlarını kolaylaştırıyorsa.
  3. Eğer bir nesnenin diğer nesnelerin hangi nesneler olduğundan habersiz, onları haberdar etme ihtiyacı varsa ve bu nesneyle diğer nesneleri birbirine kuvvetli bağlarla bağlamak istemiyorsanız.

Hemen hemen tüm nesne yönelimli dillerde, özellikle arayüz kütüphanelerinde bu desen gerçeklenmiş ve yazılımcıların kullanımına sunulmuştur. Observer tasarım deseninin class diyagramı şu şekildedir:

Gözlemci tasarım desenini daha iyi ifade etmek için daha önceden kullanmış olduğum ve canlı sistemlerde de hala kullanılan dillerden ve kütüphanelerden örnekler vermek istiyorum.  Genel örneklerden bir tanesi event yönetimi, bir diğeri ise Model-View-Controller desenidir. Bir gözlemci örneği şu şekildedir. İlk olarak kullanıcı sistemden çıkış yaptığında göndereceğimiz event sınıfını yazıyoruz. Bu event generic parametre olarak bizim yazdığımız ve kendisini dinleyecek arayüzü alıyor.

Ardından GWT’nin EventHandler sınıfından türeyen ve kullanıcı sistemden çıkış yaptığında
çalışacak metodun tanımlı olduğu interface’i yazıyoruz.

Bu arayüzü implement eden sınıf kullanıcı çıkış yaptığında çalışacak metodu barındırıyor ve bir popup çıkarıp
kullanıcıyı bilgilendiriyor.

Son olarak ise kullanıcı çıkış yaptığında yazdığımız event’i tüm gözlemcilere gönderiyoruz. Event’i göndereceğimiz
sınıf HasHandlers arayüzünü implement ediyor ve fireEvent metodunu barındırıyor.

Java ile web uygulamaları geliştirmek için tasarlanmış olan Seam Framework’ünde ise Observer deseni event yönetimi için kullanılır ve gerçeklenmesi şu şekildedir. Gözlemci metodun üzerine @Observer anotasyonu eklenir ve bu anotasyon parametre olarak dinleyeceği event’in ismini alir. Parametrede ismi geçen event gönderildiğinde bu gözlemci metod çalışır. Örnek olarak aşağıda, Seam’in güvenlik paketinde tanımlı bir event olan “loginSuccessful” event’i kullanıcı sisteme başarılı bir giriş yaptığında gönderilir. Bu event gönderilir gönderilmez aşağıdaki metod çalışır.

Model View Controller mimarisinde, gözlemci kullanımı Model ile View’ı birbirinden ayırmak için kullanılır. View observer’ı model ise Observable nesneyi temsil eder. MVC’deki gözlemci deseninin kullanımı için Ruby on Rails’ı inceleyebiliriz. MVC tabanli web uygulamasi gelistirme kutuphanesi olan Ruby on Rails’da observer deseninin model işlemlerindeki kullanımı çok basittir. Bir gözlemci sınıfı ActiveRecord::Observer sınıfından türetilir ve o sınıf ModelİsmiObserver şeklinde isimlendirilir. Bu şekilde isimlendirilen gözlemci sınıfı, başındaki isme sahip model üzerindeki işlemleri dinler. (kaydetme, silme, güncelleme..vs.) Bu işlemler ise gözlemci sınıfının metodlarının isimlerinde belirtilir. Örnek:

Yukarıdaki CommentObserver gözlemci sınıfı Comment modelinin kaydedilip kaydedilmediğini dinler. Kaydedildiğinde ise o commentin kaydedildiğini log’a yazar. Görüldüğü üzere gözlemci tasarım deseni bir çok dilde ve kütüphanede gerçeklenmiş ve yazılımcıların kullanımına sunulmuştur. Hemen hemen tüm nesne yönelimli dillerde örneklerini görebilirsiniz.

Comments are off for this post