首先了解观察者模式和发布订阅模式的区别:参考 https://juejin.im/post/5a14e9edf265da4312808d86
简单说就是,观察者模式中,观察者Observer和被观察者Observable是紧耦合的;而发布订阅模式中,发布者Publisher和订阅者Subscriber是去耦合的,通过第三方Topic或Channel关联。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够进行相应的反应处理。
JDK自带对观察者模式的实现:提供一个被观察者类Observable和观察者接口Observer,被观察者维护了观察者列表在状态改变时会遍历通知所有观察者(因此被观察者和观察者紧耦合)
Observable:
1 | public class Observable { |
Observer:
1 | public interface Observer { |
我们来举例使用JDK自带的观察者模式:
首先继承Observabe类实现被观察者逻辑:ConcreteObservable
1 | /** |
然后实现观察者接口Observer,这儿提供一个实现ConcreteObserver,实际上可以有多个观察者
1 | public class ConcreteObserver implements Observer { |
使用类:
1 | public class ObserveUsage { |
发布订阅模式是观察者模式的升级版,对事件发布方和事件订阅方进行解耦。发布方发布事件,订阅方订阅事件,再通过第三方将发布的事件通知到它的订阅者。
JDK中的事件监听实现了此模式:提供了EventObject类表示具体的事件类型,提供了一个空的监听器接口EventListener,方便扩展使用
我们来举例说明怎么使用事件监听模式:
首先定义一个事件类型基类AppEvent
1 | public class AppEvent extends EventObject { |
扩展两个具体的事件类型AppReadyEvent、AppStartingEvent
1 | // 应用启动成功READY事件 |
定义一个监听器接口AppListener定义事件通知处理协议
1 | public interface AppListener <E extends AppEvent> extends EventListener { |
扩展实现两个具体的监听器PrepareContextAppListener、SendMsgAppListener分别响应两个事件
1 | // 监听应用开始启动事件,用于准备上下文 |
定义一个第三方工具类AppEventMulticaster用于将事件和监听器组合起来
1 | /** |
最后,我们来使用监听器
1 | /** |
输出如下:
1 | PREPARE CONTEXT监听器:com.example.demo.event.PrepareContextAppListener |
可见广播发布具体的事件,相应的监听器会收到通知进行自己的逻辑处理