Varım o halde yazıyorum…

Google Guava – EventBus (Observer Pattern Uygulaması)

Mayıs 25th 2013 Java

Google’ın faydalı kütüphanesi Guava‘da geniş kullanıma müsait, esnek ve sade bir observer pattern uygulaması mevcut; EventBus. Sağladığı diğer bazı avantajlarla beraber düşününce birden observer pattern ihtiyacı olan her duruma uygulanabilir geldi gözüme. Bir nevi “silver bullet” gibi. Elbette ki değil, yok öyle bir şey.

EventBus sınıfı observer pattern‘deki olay yayınlayıcısı sınıfa (publisher) karşılık geliyor. EventBus’ın yayınlayacağı olaylardan haberdar olmak isteyen sınıflar (subscriber) bu sınıfa kayıt oluyorlar. Kayıt olmuş bu sınıflar EventBus bir olay yayınladığında @Subscribe ile belirtilmiş, tek parametresi yayınlanan olayın tipinde bir parametre olan metotları ile bu olayı yakalayabiliyorlar. EventBus haber vereceği metodu/metotları bulurken sınıf hiyerarşisini dikkate alıyor. Bu durum çok biçimliliğe elverişli, esnek kod yazabilmek açısından oldukça kullanışlı.

Bir örnek üzerinden anlatacak olursam; PolitikaHaberi, SporHaberi, HavaDurumuHaberi tipinde ve her biri Haber‘den türemiş sınıflar olsun. @Subscribe ile bildirilmiş ve tek parametresi PolitikaHaberi olan bir metot PolitikaHaberi türünde haberleri dinleyebilir. Genel bir ihtiyaç durumunda her türlü haber dinlenmek isteniyorsa mesela, bu iş @Subscribe ile bildirilmiş ve tek parametresi Haber olan bir metot ile yapılabilir.

...
@Subscribe
public void listenToSportsNews(SportsNews sportsNews){
	System.out.println("Hearing from..." + sportsNews.getType());
	for(String news : sportsNews.getNews()){
		System.out.println(news);
	}
		
}
...

@Subscribe
public void listenToNews(News newsNewsNews){
	System.out.println("Hearing from any type of news. This time : " + newsNewsNews.getType());
	for(String news : newsNewsNews.getNews()){
		System.out.println(news);
	}
	
}
...
...
//Create newsEventBus object
		EventBus newsEventBus = new EventBus("News from Earth !");;
		
		//Create newsBulletin
		NewsBulletin newsBulletin = new NewsBulletin();
		
		//Create newsListener, and register to the newsEventBus (start listening to)
		NewsListener newsListener = new NewsListener();
		newsEventBus.register(newsListener);
		
		//Publish news
		newsEventBus.post(newsBulletin.publishPoliticsNews());
		newsEventBus.post(newsBulletin.publishSportsNews());
		newsEventBus.post(newsBulletin.publishWeatherNews());
		
		//Unregister from the newsEventBus (stop listening to)
		newsEventBus.unregister(newsListener);		
...

Burada bilinmesi gerek yukarıda da söylediğim gibi EventBus bir olay yayınladığında çağıracağı metotları sınıf hiyerarşisini dikkate alarak buluyor. Bu yüzden SporHaberi yayınlandığında bunu hem spor haberi dinleyen hem de haber dinleyenler duymuş oluyor. Daha veciz bir ifadeyle Haber dinleyen her türlü haberi, SporHaberi dinleyen yalnızca spor haberini duyuyor.

EventBus sınıfı uygulamanın ihtiyacına bağlı olarak bir kere/tane (singleton) veya birden fazla oluşturulabiliyor. Farklı bağlamları olan her bir olay grubu için bir EventBus tanımı yapılabilir pekala. Daha fazla uzatmadan kaynakları işaret ederek bitireyim. Google Guava kütüphanesine şuradan erişilebilir. Detaylı bilgi ve açıklama için Google geliştirici sayfası da şurada. Eli yüzü daha düzgün bir örnek uygulama da burada

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail



gerekli



gerekli - yayımlanmayacak


Yorum Yap & Fikrini Paylaş

Kelebeğin Rüyası kendi tabiriyle şiire bahane hayatların ve aşkların hikayesi. Edebiyata ve şiire tutkun iki ince hastalıklı genç Rüştü ve Muzaffer, II.Dünya Savaşı’nın gölgesindeki 1941 Türkiye’si, Zonguldak ve haliyle kömür madenleri…Bu iki genç şair, hocaları Behçet Necatigil’in önderliğinde dönemin en önemli edebiyat dergisi Varlık’ta boy göstermeye çalışırlarken belediye başkanının kızının şehre gelişiyle bütün olaylar bambaşka […]

Önceki Yazılar

Yeni tanıştığım, son derece faydalı bir uygulamadan bahsedeyim kısaca. Halkın Read It Later olarak bildiği uygulamanın adı geliştirici şirket tarafından yaptığımız iş sadece “sonra oku” servisi olmaktan çıktı denilerekten Pocket olarak değiştirilmiş. Uygulama internette gezinirken “buna daha sonra bakınsam ya” dediğimiz türden sayfaları kaydedip, bu sayfalara dilediğimiz yerden erişebilmemizi sağlıyor. Andorid, IPhone, iPad, Kindle Fire […]

Sonraki Yazılar

Sharing
Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail