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发布事件
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 只需要关注事件类型及监听类的对应开发工作既可以。
-
方便的支持异步