【Guava】Guava EventBus & JDK Observer模式

JDK Observer模式

在这里插入图片描述

public class ObserverModeEx {

	public static class MailObservable extends Observable{
		@Override
		protected synchronized void setChanged() {
			super.setChanged();
		}

		@Override
		public void notifyObservers(Object event) {
			super.notifyObservers(event);
		}
	}

	public static class MailObserver implements Observer{

		@Override
		public void update(Observable o, Object arg) {
			System.out.println("观察到来自" + arg + "的邮件");
		}
	}

	public static void main(String[] args) {
		MailObserver mailerLi = new MailObserver();
		MailObserver mailerWang = new MailObserver();

		MailObservable mailObservable = new MailObservable();
		mailObservable.addObserver(mailerLi);
		mailObservable.addObserver(mailerWang);

		mailObservable.setChanged();
		mailObservable.notifyObservers("北京");
		mailObservable.setChanged();
		mailObservable.notifyObservers("天津");

	}
}

Guava EventBus

咬文嚼字
EventBus = Event(事件) + Bus(总线)

Guva中EventBus的机制就是观察者模式,因此符合观察者模式的一般结构:

监听者:监听来自被监听者的变更事件,完成动作变更
被监听者:发送变更事件给监听者,使监听者监听到变更事件后,完成动作变更

EventBus的用法简单总结为一句话就是:

订阅者向EventBus进行事件注册(register),表示对这个事件关心;
EventBus会向所有订阅发布者事件的订阅者进行事件的发送(post)

图解说明
向EventBus注册监听者——> Listener订阅事件 ——> EventBus发布事件

![image.png-454.2kB][2]

public class EventBusSyncEx {

	@Data
	static class Event2 {
		private String header;
		private String body;

		public Event2(String header, String body) {
			this.header = header;
			this.body = body;
		}
	}

    static class SimpleListener1 {
        /**
         *订阅方式,通过@Subscribe进行事件订阅,方法名随意
         **/
        @Subscribe
        public void task1(String s) {
            System.out.println("listener1 do task , String param:" + s);
        }


        @Subscribe
        public void task3(Object s) {
            System.out.println("listener1 do task , Object param:" + s);
        }

        @Subscribe
        public void task1(Event2 s) {
			System.out.println("event header is " + s.getHeader() + ": " + "event body is " + s.getBody());
        }
    }

    static class SimpleListener2 {
        /**
         *订阅方式,通过@Subscribe进行事件订阅,方法名随意
         **/
        @Subscribe
        public void task(String s) {
            System.out.println("listener2 do task , param:" + s);
        }
    }



    public static class SimpleEventBusExample {

        public static void main(String[] args) {
            EventBus eventBus = new EventBus();
            eventBus.register(new SimpleListener1());
            eventBus.register(new SimpleListener2());

            System.out.println("Post Simple EventBus Example");
            eventBus.post("事件一");
            eventBus.post(new Event2("header", "body"));

        }
    }
}

结论

  • EventBus,guava基于观察者模式的优雅实现。对于事件监听和发布订阅模式,使用guava eventbus可以省去开发人员很多事情,不同于JDK自带的Observer模式,不用在去定义那些复杂的类或接口来实现事件发布与订阅,Guava的EventBus 只需要关注事件类型及监听类的对应开发工作既可以。

  • 方便的支持异步

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值