`
leadtoit
  • 浏览: 61801 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

guava笔记12-EventBus

 
阅读更多

JDK从1.0开始就存在Observer和Observable,可以用来完成生产者/消费者这样的需求。其实也是观察者模式的实现。

 

Guava使用EventBus来实现类似的功能,但是用起来比Observer更方便。

直接拿代码来讲解吧。

//定义消息实体

class EventObj{

private String info;

public EventObj(String info){

this.info = info;

}

public String getInfo(){

return info;

}

}

 

//消息订阅者

class MySubcribler{

@Subscribe

public void recordInfo(EventObj eventObj){

System.out.println("first subscribe:"+eventObj.getInfo());

}

@Subscribe

public void recordInfo2(EventObj eventObj){

System.out.println("second subscribe:"+eventObj.getInfo());

}

@Subscribe

public void recordDeadEvent(DeadEvent deadEventObj){// 没有订阅者的消息一律为DeadEvent

System.out.println("dead event:"+deadEventObj.getEvent());

}

}

 

@Test

public void testEventBus(){

EventBus eventBus = new EventBus();

 

eventBus.register(new MySubcribler());//注册订阅者,可以注册多个

 

EventObj eo = new EventObj("event info");

eventBus.post(eo);  //投递消息

 

eventBus.post("no subscriber"); //投递消息,该类型的消息没有订阅者

eventBus.post(9999); //投递消息,该类型的消息没有订阅者

 

}

 

运行上面的Test,结果如下:

second subscribe:event info

first subscribe:event info

dead event:no subscriber

dead event:9999

 

可以看到,EventBus用起来非常简单。

对于subscriber而言,只需要定义接到消息后如何处理即可,采用@Subscribe注解来表示。

 

对于publisher方而言,分为“注册订阅者”和“消息投递”两个步骤。

注册订阅者就是注册所有的subscriber。

消息投递就是发送一条消息,所有的subscriber会收到这条消息,但是只有参数类型跟消息类型一致的subscriber方法才会处理这条消息。

另外,有一种特殊的消息类型DeadEvent,任何没有subscriber接收的消息类型,都会被转换为DeadEvent。所有我们可以定义一个处理方法,接收DeadEvent类型的消息,一般可用于打印日志,或者排除问题。

 

消息监听具有继承的特性,如果订阅者A监听了TypeA类型的消息,那么他也会自动监听所有TypeA的子类型的消息。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics