https://www.bilibili.com/video/BV12C4y1s7dR?p=11
监听器模式要素
- 事件
- 监听器
- 广播器
- 触发机制
Event
public abstract class WeatherEvent {
public abstract String getWeather();
}
public class RainEventListener implements WeatherEventListener{
@Override
public void onWeatherEvent(WeatherEvent event) {
if(event instanceof RainEvent) {
System.out.println("hello" + event.getWeather());
}
}
}
public class SnowEvent extends WeatherEvent{
@Override
public String getWeather() {
return "snow";
}
}
Listener
public interface WeatherEventListener {
void onWeatherEvent(WeatherEvent event) ;
}
public class RainEventListener implements WeatherEventListener{
@Override
public void onWeatherEvent(WeatherEvent event) {
if(event instanceof RainEvent) {
System.out.println("hello" + event.getWeather());
}
}
}
public class SnowEventListener implements WeatherEventListener{
@Override
public void onWeatherEvent(WeatherEvent event) {
if(event instanceof SnowEvent) {
System.out.println("hello" + event.getWeather());
}
}
}
broadcast
public interface EventMultiCaster {
void multicastEvent(WeatherEvent weatherEvent);
void addListener(WeatherEventListener weatherEventListener);
void removeListener(WeatherEventListener weatherEventListener);
}
public abstract class AbstractEventMultiCaster implements EventMultiCaster {
private List<WeatherEventListener> listenerList = new ArrayList<>();
@Override
public void multicastEvent(WeatherEvent weatherEvent) {
doStart();
listenerList.forEach(i -> i.onWeatherEvent(weatherEvent));
doEnd();
}
@Override
public void addListener(WeatherEventListener weatherEventListener) {
listenerList.add(weatherEventListener);
}
@Override
public void removeListener(WeatherEventListener weatherEventListener) {
listenerList.remove(weatherEventListener);
}
abstract void doStart();
abstract void doEnd();
}
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");
}
}
test
public class Test {
public static void main(String[] args) {
WeatherEventMulticaster weatherEventMulticaster = new WeatherEventMulticaster();
SnowEventListener snowEventListener = new SnowEventListener();
RainEventListener rainEventListener = new RainEventListener();
weatherEventMulticaster.addListener(snowEventListener);
weatherEventMulticaster.addListener(rainEventListener);
weatherEventMulticaster.multicastEvent(new SnowEvent());
weatherEventMulticaster.multicastEvent(new RainEvent());
weatherEventMulticaster.removeListener(rainEventListener);
weatherEventMulticaster.multicastEvent(new SnowEvent());
weatherEventMulticaster.multicastEvent(new RainEvent());
}