zoukankan      html  css  js  c++  java
  • 监听器设计模式

    一、监听器设计模式

    监听器的实现方案是观察者模式实现的一种,另外也称之为发布-订阅模式。观察者模式

    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
    

      

  • 相关阅读:
    MySQL数据库基本操作(二)
    MySQL数据库基本操作(一)
    13.常见模块re-正则模块
    12.常见模块time、json模块
    11.迭代器与生成器、模块与包
    10.文件的输入输出、异常
    9.多继承、类的特殊方法、装饰器
    8.类的概念、定义、属性、继承
    7.内置函数、作用域、闭包、递归
    6.函数基础
  • 原文地址:https://www.cnblogs.com/linlf03/p/12272323.html
Copyright © 2011-2022 走看看