用LOL獲得BUFF場景來看待Guava之事件總線

栗子

public class TestPreconditions {

    static class Listener {
    
        @Subscribe
        public void listen(String eventData) {
            System.out.println("接收到事件數據:" + eventData);
        }

        @Subscribe
        public void listen(Integer eventData) {
            System.out.println("接收到事件int數據:" + eventData);
        }
    }

    public static void main(String[] args) {

        EventBus bus = new EventBus();
        bus.register(new Listener());

        bus.post("這是事件數據!");
        bus.post(123456);
    }
}

結果:
在這裏插入圖片描述

應用場景

我們假設你需要設計一個lol裏面各種英雄獲得buff的處理,你就可以採用如下代碼

public class TestLolBuff {
    //藍buff
    static class BlueBuff {
    }

    //紅buff
    static class RedBuff {
    }

    //小龍buff
    static class DragonetBuff {
    }

    //大龍buff
    static class BaronBuff {
    }

    static class Listener {

        @Subscribe
        public void listen(BlueBuff eventData) {
            System.out.println("我得到了藍buff:");
        }

        @Subscribe
        public void listen(RedBuff eventData) {
            System.out.println("我得到了紅buff:");
        }

        @Subscribe
        public void listen(DragonetBuff eventData) {
            System.out.println("我得到了小龍buff:");
        }

        @Subscribe
        public void listen(BaronBuff eventData) {
            System.out.println("我得到了大龍buff:");
        }
    }

    public static void main(String[] args) {
        EventBus bus = new EventBus();
        bus.register(new Listener());
        bus.post(new DragonetBuff());
    }
}

輸出:
image.png

異步

public static void main(String[] args) {
    AsyncEventBus bus = new AsyncEventBus();
    bus.register(new Listener());
    bus.post(new DragonetBuff());
}

與Spring結合使用

每次都new AsyncEventBus();這種方式爲免有點太low,可以使用@Bean註解構建一個Bean對象

@Component
public class AsyncEventBusBean {

    @Bean
    public AsyncEventBus asyncEventBus() {
        AsyncEventBus eventBus = new AsyncEventBus(Executors.newFixedThreadPool(10));
        eventBus.register(new xxx());
        return eventBus;
    }
}
@Autowired
private AsyncEventBus asyncEventBus;
asyncEventBus.post(xxx);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章