Guava系列之EventBus

x33g5p2x  于2021-12-18 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(204)

EventBus是Guava中实现的用于发布/订阅模式的事件处理组件,它是设计模式中观察者模式的优雅实现,关于观察者模式可以看一下我的另一篇博客:设计模式学习-观察者模式

EventBus简化了观察者模式,无须创建复杂的类和接口层次结构

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在多种类型的事件中,会根据事件类型来区分,把对应的事件发送给相应的订阅者

DeadEvent

现在假设我们把事件监听改一下,把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天堂公众号,我会定期分享自己的学习成果,第一时间推送给您

上一篇:限流RateLimiter

相关文章