ArÅŸiv

Buna etikete sahip yazılar; ‘publisher subscriber pattern’

Google Guava – EventBus (Observer Pattern Uygulaması)

Cumartesi, 25 May 2013 Yorum yapılmamış

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

FacebooktwitterlinkedinmailFacebooktwitterlinkedinmail