zoukankan      html  css  js  c++  java
  • java监听器原理理解与实现

    监听器模型涉及以下三个对象,模型图如下:

    (1)事件:用户对组件的一个操作,称之为一个事件
    (2)事件源:发生事件的组件就是事件源
    (3)事件监听器(处理器):监听并负责处理事件的方法

    执行顺序如下:

    1、给事件源注册监听器
    2、组件接受外部作用,也就是事件被触发
    3、组件产生一个相应的事件对象,并把此对象传递给与之关联的事件处理器
    4、事件处理器启动,并执行相关的代码来处理该事件。

            监听器模式:事件源注册监听器之后,当事件源触发事件,监听器就可以回调事件对象的方法;更形象地说,监听者模式是基于:注册-回调的事件/消息通知处理模式,就是被监控者将消息通知给所有监控者。 

    1、注册监听器:事件源.setListener;
    2、回调:事件源实现onListener。

    下面,来看两个demo。

    一、简化了上图所示的模型,仅仅包含事件源与监听器

    [java] view plain copy
     
    1. /* 
    2.  * 事件源:事件发生的地点 
    3.  */  
    4. public class EventSource {  
    5.     private IEventListener mEventListener;  
    6.   
    7.     // 注册监听器  
    8.     public void setEventListener(IEventListener arg) {  
    9.         mEventListener = arg;  
    10.     }  
    11.   
    12.     // 触发事件  
    13.     public void EventHappened() {  
    14.         mEventListener.onclickButton();  
    15.     }  
    16.   
    17. }  
    /*
     * 事件源:事件发生的地点
     */
    public class EventSource {
        private IEventListener mEventListener;
    
        // 注册监听器
        public void setEventListener(IEventListener arg) {
            mEventListener = arg;
        }
    
        // 触发事件
        public void EventHappened() {
            mEventListener.onclickButton();
        }
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    [java] view plain copy
     
    1. /* 
    2.  * 事件监听器,事件处理器 
    3.  */  
    4. public interface IEventListener {  
    5.     void onclickButton();  
    6. }  
    /*
     * 事件监听器,事件处理器
     */
    public interface IEventListener {
        void onclickButton();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    [java] view plain copy
     
    1. public class Test {  
    2.     public static void main(String[] args) {  
    3.   
    4.         // 事件源(被监听的对象)  
    5.         EventSource m1 = new EventSource();  
    6.   
    7.         // 监听器  
    8.         IEventListener mEventListener = new IEventListener() {  
    9.   
    10.             @Override  
    11.             public void onclickButton() {  
    12.                 // TODO Auto-generated method stub  
    13.                 System.out.println(”你点击了按钮”);  
    14.             }  
    15.         };  
    16.   
    17.         // 注册监听器到事件源  
    18.         m1.setEventListener(mEventListener);  
    19.         m1.EventHappened();  
    20.     }  
    21. }  
    public class Test {
        public static void main(String[] args) {
    
            // 事件源(被监听的对象)
            EventSource m1 = new EventSource();
    
            // 监听器
            IEventListener mEventListener = new IEventListener() {
    
                @Override
                public void onclickButton() {
                    // TODO Auto-generated method stub
                    System.out.println("你点击了按钮");
                }
            };
    
            // 注册监听器到事件源
            m1.setEventListener(mEventListener);
            m1.EventHappened();
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    【实验结果】
    你点击了按钮

    二、完整模型的demo

    [java] view plain copy
     
    1. /* 
    2.  * 事件 
    3.  */  
    4. public interface IEvent {  
    5.       
    6.     void setEventListener(IEventListener arg);  
    7.       
    8.     boolean ClickButton();  
    9.       
    10.     boolean MoveMouse();  
    11.   
    12. }  
    /*
     * 事件
     */
    public interface IEvent {
    
        void setEventListener(IEventListener arg);
    
        boolean ClickButton();
    
        boolean MoveMouse();
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    [java] view plain copy
     
    1. /* 
    2.  * 事件监听器,调用事件处理器 
    3.  */  
    4. public interface IEventListener {  
    5.   
    6.     void doEvent(IEvent arg);  
    7. }  
    /*
     * 事件监听器,调用事件处理器
     */
    public interface IEventListener {
    
        void doEvent(IEvent arg);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    [java] view plain copy
     
    1. /* 
    2.  * 事件源:事件发生的地点 
    3.  */  
    4. public class EventSource implements IEvent{  
    5.     private IEventListener mEventListener;  
    6.     boolean button;  
    7.     boolean mouse;  
    8.       
    9.     //注册监听器  
    10.     @Override  
    11.     public void setEventListener(IEventListener arg){  
    12.         mEventListener = arg;  
    13.     }  
    14.       
    15.     //触发事件  
    16.     public void mouseEventHappened(){  
    17.         mouse = true;  
    18.         mEventListener.doEvent(this);  
    19.     }  
    20.   
    21.     @Override  
    22.     public boolean ClickButton() {  
    23.         return button;  
    24.         // TODO Auto-generated method stub  
    25.           
    26.     }  
    27.   
    28.     @Override  
    29.     public boolean MoveMouse() {  
    30.         // TODO Auto-generated method stub  
    31.         return mouse;  
    32.     }  
    33.   
    34. }  
    /*
     * 事件源:事件发生的地点
     */
    public class EventSource implements IEvent{
        private IEventListener mEventListener;
        boolean button;
        boolean mouse;
    
        //注册监听器
        @Override
        public void setEventListener(IEventListener arg){
            mEventListener = arg;
        }
    
        //触发事件
        public void mouseEventHappened(){
            mouse = true;
            mEventListener.doEvent(this);
        }
    
        @Override
        public boolean ClickButton() {
            return button;
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public boolean MoveMouse() {
            // TODO Auto-generated method stub
            return mouse;
        }
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    [java] view plain copy
     
    1. public class EventSource2 implements IEvent {  
    2.     private IEventListener ml;  
    3.     boolean button;  
    4.     boolean mouse;  
    5.   
    6.     @Override  
    7.     public void setEventListener(IEventListener arg) {  
    8.         ml = arg;  
    9.     }  
    10.   
    11.     @Override  
    12.     public boolean ClickButton() {  
    13.         // TODO Auto-generated method stub  
    14.         return button;  
    15.     }  
    16.   
    17.     @Override  
    18.     public boolean MoveMouse() {  
    19.         // TODO Auto-generated method stub  
    20.         return mouse;  
    21.     }  
    22.   
    23.     // 触发事件  
    24.     public void buttonEventHappened() {  
    25.         button = true;  
    26.         ml.doEvent(this);  
    27.     }  
    28.   
    29. }  
    public class EventSource2 implements IEvent {
        private IEventListener ml;
        boolean button;
        boolean mouse;
    
        @Override
        public void setEventListener(IEventListener arg) {
            ml = arg;
        }
    
        @Override
        public boolean ClickButton() {
            // TODO Auto-generated method stub
            return button;
        }
    
        @Override
        public boolean MoveMouse() {
            // TODO Auto-generated method stub
            return mouse;
        }
    
        // 触发事件
        public void buttonEventHappened() {
            button = true;
            ml.doEvent(this);
        }
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    [java] view plain copy
     
    1. public class Test {  
    2.     public static void main(String[] args) {  
    3.   
    4.         // 事件源(被监听的对象)  
    5.         EventSource m1 = new EventSource();  
    6.         EventSource2 m2 = new EventSource2();  
    7.         // 监听器  
    8.         IEventListener mEventListener = new IEventListener() {  
    9.   
    10.             @Override  
    11.             public void doEvent(IEvent arg) {  
    12.                 if (true == arg.ClickButton()) {  
    13.                     System.out.println(”你点击了按钮”);  
    14.                 }else if(true == arg.MoveMouse()){  
    15.                     System.out.println(”你移动了鼠标”);  
    16.                 }  
    17.             }  
    18.         };  
    19.   
    20.         // 注册监听器到事件源  
    21.         m1.setEventListener(mEventListener);  
    22.         m1.mouseEventHappened();  
    23.           
    24.         // 注册监听器到事件源  
    25.         m2.setEventListener(mEventListener);  
    26.         m2.buttonEventHappened();  
    27.     }  
    28. }  
    public class Test {
        public static void main(String[] args) {
    
            // 事件源(被监听的对象)
            EventSource m1 = new EventSource();
            EventSource2 m2 = new EventSource2();
            // 监听器
            IEventListener mEventListener = new IEventListener() {
    
                @Override
                public void doEvent(IEvent arg) {
                    if (true == arg.ClickButton()) {
                        System.out.println("你点击了按钮");
                    }else if(true == arg.MoveMouse()){
                        System.out.println("你移动了鼠标");
                    }
                }
            };
    
            // 注册监听器到事件源
            m1.setEventListener(mEventListener);
            m1.mouseEventHappened();
    
            // 注册监听器到事件源
            m2.setEventListener(mEventListener);
            m2.buttonEventHappened();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    【实验结果】
    你移动了鼠标
    你点击了按钮

  • 相关阅读:
    3d服务器配置
    Can't connect to postgres on centos with psycopg
    flask快速入门
    nohup: cannot run command “/bin/java”:
    linux 上redis的启动口令
    CentOS网络设置 couldn't resolve host 'mirrorlist.centos.org问题解决
    CentOS下使用Mysql
    解决nodejs跨域的一个中间件
    JS实现禁用滑动条但滑动条不消失的效果
    JQ实现下拉加载更多
  • 原文地址:https://www.cnblogs.com/zgq123456/p/9887792.html
Copyright © 2011-2022 走看看