监听者模式是在看springBoot监听器源码时看到它有在用,所以简单记录下,监听者模式跟观察者模式有点类似。
推荐书籍:Java 设计模式深入研究(微信读书)
监听者模式四要素:
1.事件
2.监听器
3.广播器
4.触发机制
手写天气广播事件仿真功能:
类文件结构图
源码:
package com.xy.event;
public abstract class WeatherEvent {
public abstract String getWeather();
}
package com.xy.event;
public class SnowEvent extends WeatherEvent {
@Override
public String getWeather() {
return "snow";
}
}
package com.xy.event;
public class RainEvent extends WeatherEvent {
@Override
public String getWeather() {
return "rain";
}
}
package com.xy.event;
public interface WeatherListener {
void onWeatherEvent(WeatherEvent event);
}
package com.xy.event;
public class RainListener implements WeatherListener {
@Override
public void onWeatherEvent(WeatherEvent event) {
if(event instanceof RainEvent){
System.out.println("RainListener :hello"+event.getWeather());
}
}
}
package com.xy.event;
public class Snowlistener implements WeatherListener {
@Override
public void onWeatherEvent(WeatherEvent event) {
if(event instanceof SnowEvent){
System.out.println("Snowlistener :hello"+event.getWeather());
}
}
}
package com.xy.event;
public interface EventMulticaster {
//广播事件
void muticastEvent(WeatherEvent event);
//增加监听器事件
void addListener (WeatherListener weatherListener);
//移除监听器事件
void removeListener(WeatherListener weatherListener);
}
package com.xy.event;
import java.util.ArrayList;
import java.util.List;
public abstract class AbstractEventMulticaster implements EventMulticaster {
private List<WeatherListener> listenerList = new ArrayList<WeatherListener>();
@Override
public void muticastEvent(WeatherEvent event) {
doStart();
listenerList.forEach(i -> i.onWeatherEvent(event));
doEnd();
}
@Override
public void addListener(WeatherListener weatherListener) {
listenerList.add(weatherListener);
}
@Override
public void removeListener(WeatherListener weatherListener) {
listenerList.remove(weatherListener);
}
abstract void doStart();
abstract void doEnd();
}
package com.xy.event;
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.muticastEvent(new SnowEvent());
eventMulticaster.muticastEvent(new RainEvent());
eventMulticaster.removeListener(rainListener);
eventMulticaster.muticastEvent(new SnowEvent());
eventMulticaster.muticastEvent(new RainEvent());
//判断是否是它的接口实现类
System.out.println(rainListener instanceof WeatherListener);
//判断是否是某个类
System.out.println(rainListener instanceof RainListener);
}
}
package com.xy.event;
public class WeatherEventMulticaster extends AbstractEventMulticaster {
@Override
void doStart() {
System.out.println("begin broadcast weather event");
}
@Override
void doEnd() {
System.out.println("end broadcast weather event");
}
}