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
    

      

  • 相关阅读:
    C语言main函数参数解析代码模板
    C语言函数指针复习小程序
    反转链表
    (Mingw32环境下)C语言使用库函数分配内存,按指定字节对齐
    Scrum meeting 3
    胆大妄为【DDWW】 Scrum meeting 2
    胆大妄为【DDWW】 Scrum meeting 1
    胆大妄为【DDWW】 《实验八 团队作业4:团队项目需求建模与系统设计》
    胆大妄为【DDWW】 实验七 团队作业3:团队项目需求分析与原型设计
    胆大妄为【DDWW】 实验六 团队作业2 :西北师范大学毕业生就业信息管理系统
  • 原文地址:https://www.cnblogs.com/linlf03/p/12272323.html
Copyright © 2011-2022 走看看