java设计模式之监听者模式

监听者模式是在看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");
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容