一、监听器设计模式
监听器的实现方案是观察者模式实现的一种,另外也称之为发布-订阅模式。观察者模式
1、监听器模式介绍
2、系统监听器介绍
3、监听事件触发机制
4、自定义监听器实践
1、监听器模式介绍

监听模式要素
事件
监听器
广播器
触发机制
2、监听器模式实践
模拟场景: 天气是下雨下雪,则通过广播器广播这些事件,如果对下雨下雪感兴趣的监听器,就监听这些事件,做出相应的行为
1) 事件
public abstract class WeatherEvent {
public abstract String getWeather();
}
下雨事件
public class RainEvent extends WeatherEvent{
@Override
public String getWeather() {
return "rain";
}
}
下雪事件
public class SnowEvent extends WeatherEvent{
@Override
public String getWeather() {
return "snow";
}
}
2)监听器
public interface WeatherListener {
void onWeatherEvent(WeatherEvent event);
}
下雨监听器
/**
* 下雨监听器
*/
public class RainListener implements WeatherListener {
@Override
public void onWeatherEvent(WeatherEvent event) {
if(event instanceof RainEvent){
System.out.println("hello " +((RainEvent) event).getWeather());
}
}
}
下雪监听器
/**
* 下雪监听器
*/
public class SnowListener implements WeatherListener {
@Override
public void onWeatherEvent(WeatherEvent event) {
if(event instanceof SnowEvent){
System.out.println("hello " +((SnowEvent) event).getWeather());
}
}
}
3)广播器
事件广播接口
/**
* 广播器
*/
public interface EventMulticaster {
//广播事件
void multicastEvent(WeatherEvent event);
void addListener(WeatherListener weatherListener);
void removeListener(WeatherListener weatherListener);
}
抽象事件广播器
public abstract class AbstractEventMulticaster implements EventMulticaster {
private List<WeatherListener> listenerList = new ArrayList<>();
@Override
public void multicastEvent(WeatherEvent event) {
doStart();
listenerList.forEach(i -> i.onWeatherEvent(event));
doEnd();
}
protected abstract void doStart();
protected abstract void doEnd();
@Override
public void addListener(WeatherListener weatherListener) {
listenerList.add(weatherListener);
}
@Override
public void removeListener(WeatherListener weatherListener) {
listenerList.remove(weatherListener);
}
}
天气广播器
public class WeatherEventMulticaster extends AbstractEventMulticaster{
@Override
protected void doStart() {
System.out.println("begin boradcast weacher event");
}
@Override
protected void doEnd() {
System.out.println("end boradcast weacher event");
}
}
4)触发机制
public class Test {
public static void main(String[] args) {
//构造一个广播器
WeatherEventMulticaster eventMulticaster = new WeatherEventMulticaster();
//创建两个监听器
RainListener rainListener = new RainListener();
SnowListener snowListener = new SnowListener();
//将监听器添加到广播器当中
eventMulticaster.addListener(rainListener);
eventMulticaster.addListener(snowListener);
//广播器广播下雪事件
eventMulticaster.multicastEvent(new SnowEvent());
//广播器广播下雨事件
eventMulticaster.multicastEvent(new RainEvent());
System.out.println("--------------------");
eventMulticaster.removeListener(rainListener);
//广播器广播下雪事件
eventMulticaster.multicastEvent(new SnowEvent());
//广播器广播下雨事件
eventMulticaster.multicastEvent(new RainEvent());
}
}
打印结果
begin boradcast weacher event hello snow end boradcast weacher event begin boradcast weacher event hello rain end boradcast weacher event -------------------- begin boradcast weacher event hello snow end boradcast weacher event begin boradcast weacher event end boradcast weacher event
3、SpringBoot中的监听器模式
1) 监听器 ApplicationListener
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E var1);
}
FunctionalInterface是jdk8新增的,表示ApplicationListener接口只有一个方法,如果大于一个方法,就不能使用这注解
接口中有个泛型<E extends ApplicationEvent>,继承自ApplicationEvent。就代表这实现这个接口时,可以声明对哪些事件(如ApplicationEvent)感兴趣,在触发监听器的时候,对感兴趣的事件进行过滤。
2) 系统广播器ApplicationEventMulticaster接口
public interface ApplicationEventMulticaster {
void addApplicationListener(ApplicationListener<?> var1);
void addApplicationListenerBean(String var1);
void removeApplicationListener(ApplicationListener<?> var1);
void removeApplicationListenerBean(String var1);
void removeAllListeners();
void multicastEvent(ApplicationEvent var1);
void multicastEvent(ApplicationEvent var1, @Nullable ResolvableType var2);
}
ApplicationEventMulticaster接口主要有三类方法,增加监听器,删除监听器,广播方法
3) 系统事件

4) SpringBOot中的事件发送顺序
待补充
5) 监听器注册
类似于前面介绍的初始化器。在设置初始化器后面调用设置监听器
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

和初始化器调用的同一个方法getSpringFactoriesInstances,只是参数为ApplicationListener.class
原文:https://www.cnblogs.com/linlf03/p/12272323.html