欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

guava笔记12-EventBus 博客分类: guavajava相关

程序员文章站 2024-03-23 15:20:34
...

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的子类型的消息。