Guava学习笔记:EventBus

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

 

1. 首先定义一个事件中心,用于注册或者销毁或发送事件使用

package com.ijson.event;

import com.google.common.eventbus.EventBus;

/**
 * desc:事件中心,注册,销毁以及事件的分发
 * version: 6.7
 * Created by cuiyongxu on 2019/9/3 12:45 PM
 */
public class EventBusCenter {

    private static EventBus eventBus = new EventBus();
    public static EventBusCenter instance = doCreate();


    private static synchronized EventBusCenter doCreate() {
        if (instance == null) {

            instance = new EventBusCenter();
        }
        return instance;
    }


    private EventBusCenter() {
    }


    public void register(Object obj) {
        eventBus.register(obj);
    }

    public void unregister(Object obj) {
        eventBus.unregister(obj);
    }

    public void post(Object obj) {
        eventBus.post(obj);
    }
}

2. 定义Consumer,可以理解为license,用于接受事件中心发出事件的处理,咱们定义3个,一个入参是String,一个是Integer(这里要说一下,EventBus不会自动装箱,不能用int接受参数),一个是自定义的一个User对象

package com.ijson.event;

import com.google.common.eventbus.Subscribe;

/**
 * desc: 接收String类型的参数
 * version: 6.7
 * Created by cuiyongxu on 2019/9/3 1:42 PM
 */
public class DataConsumers01 {
    @Subscribe
    public void method(String msg) {
        System.out.println("DataConsumers01 接收String类型参数: " + msg);
    }

}

3. 定义一个Integer类型的Consumer


package com.ijson.event;

import com.google.common.eventbus.Subscribe;

public class DataConsumers02 {
    @Subscribe
    public void method(Integer msg) {
        System.out.println("DataConsumers02 接收Integer类型参数: " + msg);
    }
}

4. 定义一个User对象

package com.ijson.event.model;

/**
 * desc:
 * version: 6.7
 * Created by cuiyongxu on 2019/9/3 2:33 PM
 */


public class User {
    private String id;

    private String name;

    private Integer age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static User create() {
        User user = new User();
        user.setId("1");
        user.setName("孙悟空");
        user.setAge(560);
        return user;
    }
}


5. 定义以User为入参的的Consumer


package com.ijson.event;

import com.google.common.eventbus.Subscribe;
import com.ijson.event.model.User;

public class DataConsumers03 {
    @Subscribe
    public void method(User user) {
        System.out.println("DataConsumers03 接收User参数: " + user.toString());
    }
}

 

6. 写个单元测试,跑一下

package com.ijson.event;

import com.ijson.event.model.User;
import org.junit.Test;

import java.util.logging.Logger;

/**
 * desc:
 * version: 6.7
 * Created by cuiyongxu on 2019/9/3 2:38 PM
 */
public class EventBusTest {

    private Logger logger = Logger.getLogger(EventBusTest.class.getName());

    @Test
    public void itest() {

        DataConsumers01 dataConsumers01 = new DataConsumers01();
        DataConsumers02 dataConsumers02 = new DataConsumers02();
        DataConsumers03 dataConsumers03 = new DataConsumers03();


        //注册三个监听者
        EventBusCenter.instance.register(dataConsumers01);
        EventBusCenter.instance.register(dataConsumers02);
        EventBusCenter.instance.register(dataConsumers03);

        logger.info("============   start  ====================");

        EventBusCenter.instance.post("post string method");
        EventBusCenter.instance.post(123);
        EventBusCenter.instance.post(User.create());

        logger.info("============ after unregister ============");
        // 注销dataConsumers02,接收参数为Integer,
        EventBusCenter.instance.unregister(dataConsumers02);
        // 不会被执行,因为已经被注销
        EventBusCenter.instance.post(123);
        // 而其他的则不受影响
        EventBusCenter.instance.post("post string method");
        EventBusCenter.instance.post(User.create());

        logger.info("============ end ============");
    }

}

7. 结果输出

信息: ============   start  ====================
DataConsumers01 接收String类型参数: post string method
DataConsumers02 接收Integer类型参数: 123
DataConsumers03 接收User参数: User{id='1', name='孙悟空', age=560}
九月 05, 2019 2:45:17 下午 com.ijson.event.EventBusTest itest
信息: ============ after unregister ============
九月 05, 2019 2:45:17 下午 com.ijson.event.EventBusTest itest
信息: ============ end ============
DataConsumers01 接收String类型参数: post string method
DataConsumers03 接收User参数: User{id='1', name='孙悟空', age=560}

 

以上demo案例已提交到github:https://github.com/ijson/eventbus.git

 

 

您还没有登录,请先 登录或者 注册后,添加评论
公告栏
当前开发版本 2.1.0
  • 公告栏展示
  • 打赏功能添加
  • 消息系统后端支持(回复,删除,读取)
  • 支持RSS
赞助开发

支持下作者

您的支持是我们最大的动力

...
狸猫
友情链接
INAG工具库
热门文章
最近发表