EventBus(事件匯流排)
Guava在guava-libraries中為我們提供了事件匯流排EventBus庫,它是事件釋出訂閱模式的實現,讓我們能在領域驅動設計(DDD)中以事件的弱引用本質對我們的模組和領域邊界很好的解耦設計。
不再多的廢話,直奔Guava EventBus主題。首先Guava為我們提供了同步事件EventBus和非同步實現AsyncEventBus兩個事件匯流排,他們都不是單例的,官方理由是並不想我們我們的使用方式。當然如果我們想其為單例,我們可以很容易封裝它,一個單例模式保證只建立一個例項就對了。
下面將以EventBus為例,AsyncEventBus使用方式與其一致的。
訂閱
首先EventBus為我們提供了register方法來訂閱事件,Guava在這裡的實現很友好,我們不需要實現任何的額外介面或者base類,只需要在訂閱方法上標註上@Subscribe
new Object() {
@Subscribe
public void lister(Integer integer) {
System.out.printf("%d from int%n", integer);
}
}
Guava釋出的事件預設不會處理執行緒安全的,但我們可以標註@AllowConcurrentEvents來保證其執行緒安全
釋出
對於事件源,則可以通過post方法釋出事件。 正在這裡對於Guava對於事件的釋出,是依據上例中訂閱方法的方法引數型別決定的,換而言之就是post傳入的型別和其基類型別可以收到此事件。例如下例:
final EventBus eventBus = new EventBus(); eventBus.register(new Object() { @Subscribe public void lister(Integer integer) { System.out.printf("%s from int%n", integer); } @Subscribe public void lister(Number integer) { System.out.printf("%s from Number%n", integer); } @Subscribe public void lister(Long integer) { System.out.printf("%s from long%n", integer); } }); eventBus.post(1); eventBus.post(1L);
在這裡有 Integer,Long,與它們基類Number。我們傳送一個整數資料的時候,或者Integer和Number的方法接收,而Long型別則Long型別和Number型別接受。
所以博主建議對於每類時間封裝一個特定的事件型別是必要的。
DeadEvent
DeadEvent暫時不清楚怎麼翻譯更合意,它描述的是死亡事件,即沒有沒任何訂閱者關心,沒有被處理,以DeadEvent型別引數的方法表示.例如在上例中我們post一個Object型別,如下:
final EventBus eventBus = new EventBus();
eventBus.register(new Object() {
@Subscribe
public void lister(DeadEvent event) {
System.out.printf("%s=%s from dead events%n", event.getSource().getClass(), event.getEvent());
}
});
eventBus.post(new Object());
更多Guava博文: