Arşiv

Buna etikete sahip yazılar; ‘observer 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