zoukankan      html  css  js  c++  java
  • 监听器模式(Listener)

        监听器模式有三个要素:

          事件源:顾名思义,事件发生的源头,比如点击的按钮,可以工作可以运作的机器人,属于被监听的对象

          事件对象:这个经常和事件源混淆,它经常被用来包装事件源,或者说执行某个方法,比如点击事件,机器人程序执行

          监听器:这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参

      当事件源对象上发生操作时,将会调用时间监听的一个方法,并在调用方法的时候把事件对象传递过去

     执行顺序:

      1.给事件源注册监听器

      2.组件接受外部作用,也就是事件触发

      3.组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器

      4.事件处理器启动,并执行相关代码来处理事件

    监听器模式:事件源注册监听器后,当事件源触发事件,监听器就可以回调事件对象的方法;

    更加形象地说,监听者模式就是基于:注册-回调事件/消息通知处理模式,就是被监听者将消息通知给所有监控者

      1.注册监听器:事件源.setListener

      2.回调:事件源实现onListener

    /**
     * 事件源:机器人
     */
    public class Robot{
        private RobotListener listener;
    
        /**
         * 注册机器人监听器
         * @param listener
         */
        public void registerListener(RobotListener listener){
            this.listener = listener;
        }
    
        /**
         * 工作
         *
         */
        public void working() {
            if (listener != null){
                Even even = new Even(this);
                this.listener.working(even);
            }
            System.out.println("robot 开始 工作.......");
        }
    
        /**
         * 跳舞
         *
         */
        public void dancing() {
            if (listener != null){
                Even even = new Even(this);
                this.listener.dancing(even);
            }
            System.out.println("robot 开始 跳舞.......");
        }
    }
    

      

    /**
     * 监听器接口
     */
    public interface RobotListener {
        /**
         * 工作
         * @param even
         */
        void working(Even even);
    
        /**
         * 跳舞
         * @param even
         */
        void dancing(Even even);
    }
    

      

    public class MyRobotListener implements RobotListener {
        /**
         * 工作
         *
         * @param even
         */
        @Override
        public void working(Even even) {
            Robot robot = even.getRobot();
            System.out.println("机器人开始工作,防止偷窥.....");
        }
    
        /**
         * 跳舞
         *
         * @param even
         */
        @Override
        public void dancing(Even even) {
            Robot robot = even.getRobot();
            System.out.println("机器人开始跳舞,防止走神.....");
        }
    }
    

      

    /**
     * 事件对象
     */
    public class Even {
        private Robot robot;
    
        public Even() {
            super();
        }
    
        public Even(Robot robot) {
            super();
            this.robot = robot;
        }
        public Robot getRobot(){
            return robot;
        }
    
        public void setRobot(Robot robot) {
            this.robot = robot;
        }
    }
    

      

    public class TestListener {
        public static void main(String[] args) {
            Robot robot = new Robot();
            robot.registerListener(new MyRobotListener());
            robot.working();
            robot.dancing();
        }
    }
    

     or

    /**
     * 监听器接口
     */
    public interface EventListener extends java.util.EventListener {
    
        /**
         * 事件处理
         * @param eventObject
         */
        void handleEvent(EventObject eventObject);
    
    }
    

      

    /**
     * 事件对象
     */
    public class EventObject extends java.util.EventObject {
    
        public EventObject(Object source) {
            super(source);
        }
        public void doEvent(){
            System.out.println("通知一个事件源 source:"+this.getSource());
        }
    }
    

      

    /**
     * 事件源
     */
    public class EventSource {
        // 监听器列表,
        private List<EventListener> listeners =  new ArrayList();
    
        public  void addListener(EventListener listener){
            listeners.add(listener);
        }
        public  void removeListener(EventListener listener){
            listeners.remove(listener);
        }
        public  void notifyListenerEvent(EventObject eventObject){
            listeners.forEach(x->{
                x.handleEvent(eventObject);
            });
        }
    }
    

      测试执行

    public class EventDome {
        public static void main(String[] args) {
            EventSource eventSource = new EventSource();//事件源
            eventSource.addListener(eventObject -> {
                eventObject.doEvent();
                if (eventObject.getSource().equals("closeWindow")) {
                    System.out.println("doClose。。。。。"); //回调
                }
            });
            EventObject eventObject = new EventObject("closeWindow"); // 事件对象
            eventSource.notifyListenerEvent(eventObject); // 触发事件
        }
    }

    通知一个事件源 source:closeWindow
    doClose。。。。。

      EventListener是一个回调接口类,handleEvent是一个回调函数接口

    https://www.cnblogs.com/jackson-yqj/p/7784694.html

  • 相关阅读:
    大龄开发人员如何破局
    在c++MFC下用PCL显示操作点云文件 MFC对话框显示操作PCL点云
    记录学习图像处理过程中不错的教程博客
    做三维模型识别目标定位配准测量的有关资料记录
    OpenCASCADE(一) VS2017+OpenCASCADE+MFC +win10下载配置安装运行单文档程序画个基本图形
    关于opengl中的三维矩阵平移代码,矩阵旋转代码,推导过程理解 OpenGL计算机图形学的一些必要矩阵运算知识 glTranslatef(x,y,z)glRotatef(angle,x,y,z)函数详解
    深度学习系列教程目录
    c/c++ 2019公司面试题目录
    c++ 知道旋转平移变换前后矩阵向量值 求旋转变换矩阵c++/c#代码 知道两个向量求他们的旋转变换矩阵
    OpenCV与MFC实战之图像处理 样本采集小工具制作 c++MFC课程设计
  • 原文地址:https://www.cnblogs.com/huan30/p/12812201.html
Copyright © 2011-2022 走看看