Guava EventBus

文章目录

  • 1. EventBus基本用法
  • 2. 特殊事件为Dead Event
  • 3. Event的继承

EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。

1. EventBus基本用法

使用Guava之后, 如果要订阅消息, 就不用再继承指定的接口, 只需要在指定的方法上加上@Subscribe注解即可。

订户的工作:在事件处理方法上加上@Subscribe注解,方法名称随便,方法参数为监听的事件类型,这里是监听EventBus发出的TestEvent事件。如果需要监听多个事件,则需要实现多个方法,每个方法都加上@subscribe注解。

public class EventListener {
    public int lastMessage = 0;

    @Subscribe
    public void listen(TestEvent event) {
        lastMessage = event.getMessage();
        System.out.println("Message:"+lastMessage);
    }

    public int getLastMessage() {      
        return lastMessage;
    }
}

消息体:封装某种具体的事件

public class TestEvent {
    private final int message;
    public TestEvent(int message) {        
        this.message = message;
        System.out.println("event message:"+message);
    }
    public int getMessage() {
        return message;
    }
}

另外,需要将订户注册到EventBus上,完成订阅工作。

public class TestEventBus {
    @Test
    public void testReceiveEvent() throws Exception {

        EventBus eventBus = new EventBus("test");
        EventListener listener = new EventListener();
        eventBus.register(listener);
        eventBus.post(new TestEvent(200));
        eventBus.post(new TestEvent(300));
        eventBus.post(new TestEvent(400));
        System.out.println("LastMessage:"+listener.getLastMessage());
        ;
    }
}

2. 特殊事件为Dead Event

如果EventBus发送的消息都不是订阅者关心的称之为Dead Event。订阅也可以响应处理该事件

public class DeadEventListener {
    boolean notDelivered = false;  
       
    @Subscribe  
    public void listen(DeadEvent event) {  
        
        notDelivered = true;  
    }  
   
    public boolean isNotDelivered() {  
        return notDelivered;  
    }  
}

3. Event的继承

如果订户监听Event A, 而Event A有一个子类Event B, 此时订户将同时接收Event A和B消息

你可能感兴趣的:(JAVA)