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