zoukankan      html  css  js  c++  java
  • 初识-----------事件,监听器实现与原理

    感谢作者,本文转载来自:https://www.cnblogs.com/againn/p/9512013.html

    监听器,字面上的理解就是监听观察某个事件(程序)的发生情况,当被监听的使劲按真的发生了的时候,事件发生者(事件源)就会给注册该事件的监听者(监听器)发送消息,告诉监听者某些消息,同时监听者页获得一份事件对象,根据这个对象可以获得相关属性和执行相关操纵。

    监听器模型涉及有三个对象

    1. 事件:用户对组件的一个操作,或者说程序执行某个方法,称之为一个事件,如机器人程序执行工作。

    2. 事件源:发生事件的组件就是事件源,也就是被监听对象,如机器人可以工作,跳舞

    3. 事件的监听器处理器:监听并负责处理事件方法,如监听机器人的工作情况,机器人工作前后做出的反应

     执行顺序如下:

    1. 将事件源注册到监听器

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

    3. 产生一个事件对象,并将事件对象传递给监听器,由监听处理器进行处理。

    4. 监听器执行相关的代码来处理该事件。

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

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

    2. 回调:事件源实现onListener.

    下面是一个模仿监听器的demo,需求:事件机器人工作和跳舞在机器人工作和跳舞之前添加相关的提示

    package com.ssm.listener.robotListener;
     2 
     3 /**
     4  * 事件源:机器人
     5  */
     6 public class Robot {
     7 
     8     private RobotListener listener;
     9 
    10     /**
    11      * 注册机器人监听器
    12      * @param listener
    13      */
    14     public void registerListener(RobotListener listener){
    15      this.listener  = listener;
    16     }
    17 
    18     /**
    19      * 工作
    20      */
    21     public void working(){
    22         if(listener!=null){
    23             Even even = new Even(this);
    24             this.listener.working(even);
    25         }
    26         System.out.println("机器人开始工作......");
    27     }
    28 
    29     /**
    30      * 跳舞
    31      */
    32     public void dancing(){
    33         if(listener!=null){
    34             Even even = new Even(this);
    35             this.listener.dancing(even);
    36         }
    37         System.out.println("机器人开始跳舞......");
    38     }
    39 
    40 
    41 }

    创建Event对象

    package com.ssm.listener.robotListener;
     2 
     3 /**
     4  * 事件对象
     5  */
     6 public class Even {
     7 
     8     private Robot robot;
     9 
    10     public Even(){
    11         super();
    12     }
    13     public Even(Robot robot){
    14         super();
    15         this.robot = robot;
    16     }
    17 
    18 
    19     public Robot getRobot() {
    20         return robot;
    21     }
    22 
    23     public void setRobot(Robot robot) {
    24         this.robot = robot;
    25     }
    26 }

    创建监听器接口RobotListener

    package com.ssm.listener.robotListener;
     2 
     3 /**
     4  * 事件监听器
     5  */
     6 public interface RobotListener {
     7 
     8     public void working(Even even);
     9     public void dancing(Even even);
    10 }

    实现事件监听器MyRobotllistener

    package com.ssm.listener.robotListener;
     2 
     3 public class MyRobotListener implements  RobotListener{
     4     @Override
     5     public void working(Even even) {
     6         Robot robot = even.getRobot();
     7         System.out.println("机器人工作提示:请看管好的你机器人,防止它偷懒!");
     8     }
     9 
    10     @Override
    11     public void dancing(Even even) {
    12         Robot robot = even.getRobot();
    13         System.out.println("机器人跳舞提示:机器人跳舞动作优美,请不要走神哦!");
    14     }
    15 }
    package com.ssm.listener.robotListener;
     2 
     3 public class TestListener {
     4 
     5     public static void main(String[] args) {
     6         Robot robot = new Robot();
     7         robot.registerListener(new MyRobotListener());
     8         robot.working();
     9         robot.dancing();
    10     }
    11 }
  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/dousil/p/12881172.html
Copyright © 2011-2022 走看看