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
    

      

  • 相关阅读:
    BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基
    BZOJ3759: Hungergame 博弈论+线性基
    NOI模拟赛Day2
    期望dp BZOJ3450+BZOJ4318
    NOI模拟赛 Day1
    NOI模拟 热身赛T1
    【BZOJ4260】 Codechef REBXOR 可持久化Trie
    【BZOJ3673】&&【BZOJ3674】: 可持久化并查集 by zky 可持久化线段树
    【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
    【bzoj3527】[Zjoi2014]力 FFT
  • 原文地址:https://www.cnblogs.com/linlf03/p/12272323.html
Copyright © 2011-2022 走看看