一、監聽器設計模式
監聽器的實現方案是觀察者模式實現的一種,另外也稱之為發布-訂閱模式。觀察者模式
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
