EventBus是Guava中实现的用于发布/订阅模式的事件处理组件,它是设计模式中观察者模式的优雅实现,关于观察者模式可以看一下我的另一篇博客:设计模式学习-观察者模式
EventBus简化了观察者模式,无须创建复杂的类和接口层次结构
1、定义事件对象
public class Event {
private String message;
public Event(String message){
this.message = message;
}
public String getMessage() {
return message;
}
}
2、定义事件监听
public class EventListener {
@Subscribe
public void listener(Event event){
System.out.println("Subscribe 接收消息:" + event.getMessage());
}
}
3、注册监听到EventBus,并测试消息发送
public class MessageEventDemo {
public static void main(String[] args){
EventBus eventBus = new EventBus("test");
//注册监听到eventBus
eventBus.register(new EventListener());
//通过eventBus发送两笔消息
eventBus.post(new Event("send message1"));
eventBus.post(new Event("send message2"));
}
}
运行结果:
Subscribe 接收消息:send message1
Subscribe 接收消息:send message2
可以看到用EventBus实现这种发布/订阅模式的事件处理是非常简单的
1、定义两种类型的事件对象
public class EventA {
private String message;
public EventA(String message){
this.message = message;
}
public String getMessage() {
return message;
}
}
public class EventB {
private String message;
public EventB(String message){
this.message = message;
}
public String getMessage() {
return message;
}
}
2、定义事件监听
public class MultipleEventListener {
@Subscribe
public void listenerEventA(EventA eventA){
System.out.println("subscribe EventA:" + eventA.getMessage());
}
@Subscribe
public void listenerEventB(EventB eventB){
System.out.println("subscribe EventB:" + eventB.getMessage());
}
}
3、注册监听并测试结果
public class EventTest {
public static void main(String[] args){
EventBus eventBus = new EventBus("testMultiple");
//注册监听
eventBus.register(new MultipleEventListener());
//发送不同类型的事件
eventBus.post(new EventA("EventA Message"));
eventBus.post(new EventB("EventB Message"));
}
}
运行结果:
subscribe EventA:EventA Message
subscribe EventB:EventB Message
从运行结果可以看出来,EventBus在多种类型的事件中,会根据事件类型来区分,把对应的事件发送给相应的订阅者
现在假设我们把事件监听改一下,把EventB的监听注释掉,加入一个DeadEvent的监听
public class MultipleEventListener {
@Subscribe
public void listenerEventA(EventA eventA){
System.out.println("subscribe EventA:" + eventA.getMessage());
}
// @Subscribe
// public void listenerEventB(EventB eventB){
// System.out.println("subscribe EventB:" + eventB.getMessage());
// }
@Subscribe
public void listenerDeadEvent(DeadEvent deadEvent){
System.out.println("deadEvent:" + deadEvent.getEvent());
}
}
继续运行上面的EventTest,可以得到如下结果:
subscribe EventA:EventA Message
deadEvent:org.kxg.guava.eventBus.multiple.EventB@2a18f23c
可以看到EventA可以正常发送到订阅者,EventB没有订阅者,会把消息发给DeadEvent
DeadEvent就是用来接收这种没有订阅者的消息
如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注Java天堂公众号,我会定期分享自己的学习成果,第一时间推送给您