原文链接

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。 我们是写监听器去监听其他对象,那么我们如果想设计一个对象,让这个对象可以被别的对象监听又该怎么做呢,
可以按照严格的事件处理模型来设计一个对象,这个对象就可以被别的对象监听,事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。

模型图

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

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

执行顺序如下

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

监听器模式

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

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

下面,来看两个demo。

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

     /*
* 事件源:事件发生的地点
*/
public class EventSource {
private IEventListener mEventListener; // 注册监听器
public void setEventListener(IEventListener arg) {
mEventListener = arg;
} // 触发事件
public void EventHappened() {
mEventListener.onclickButton();
} }

EventSource

     /*
* 事件监听器,事件处理器
*/
public interface IEventListener {
void onclickButton();
}

IEventListener

     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();
}
}

Test

【实验结果】

你点击了按钮

完整模型的demo

     /*
* 事件
*/
public interface IEvent { void setEventListener(IEventListener arg); boolean ClickButton(); boolean MoveMouse(); }

IEvent

     /*
* 事件监听器,调用事件处理器
*/
public interface IEventListener { void doEvent(IEvent arg);
}

IEventListener

     /*
* 事件源:事件发生的地点
*/
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;
} }

EventSource

     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);
} }

EventSource2

     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();
}
}

Test

【实验结果】

你移动了鼠标
你点击了按钮

[转]Java监听器的原理与实现的更多相关文章

  1. java 监听器实现原理

      实例二: @Override public void onStart(Intent intent, int startid) { super.onStart(intent, startid); l ...

  2. 自己编写一个Java监听器

    Java监听器 1.原理: 当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法. 例如:创建一个“人”类Class Person 人拥有吃的方法public void eat(){},我 ...

  3. JAVA监听器原理

    http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...

  4. java监听器演示样例

    监听器的原理是观察者模式.就像明星(事件源)聚拢了一群粉丝(观察者).当明星有啥举动的时候会通过粉丝们报道出去. 订阅信息.计算器button都是该原理的应用. 以下写了一个监听器的小样例: pack ...

  5. 4.1 Spring源码 --- 监听器的原理

    目标: 1. 监听器如何使用 2. 监听器的原理 3. 监听器的类型 4. 多播器的概念和作用 5. 接口类型的监听器是如何注册的? 6. 注解类型的监听器和如何注册的? 7. 如果想在所有的bean ...

  6. 深入Java核心 Java内存分配原理精讲

    深入Java核心 Java内存分配原理精讲 栈.堆.常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,详细讲解Java内存分配方面的知识. Java内存分 ...

  7. paip.java UrlRewrite 的原理and实现 htaccess正则表达式转换

    paip.java UrlRewrite 的原理and实现 htaccess正则表达式转换 #---KEYWORD #-正则表达式 正则表达式 表示 非指定字符串开头的正则 排除指定目录.. 作者 老 ...

  8. Java虚拟机工作原理详解 (一)

    一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 javac YourClassNam ...

  9. Java虚拟机工作原理详解

    原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了 ...

随机推荐

  1. Innovus update_io_latency

    在Innovus中从ccopt 后的timing report中可以看到clock delay是从负值开始算起的,这个是因为在ccopt过程中进行了的update latency的动作. 基于bloc ...

  2. 关于excuteQuery与execute()

    excuteQuery是查询语句,如果是更新或者插入或报错,换成execute()就好了

  3. 2、介绍在TensorFlow当中使用不同的方式创建张量tensor

    import tensorflow as tf from tensorflow.python.framework import ops ops.reset_default_graph() #开始一个计 ...

  4. vue 中监听页面滚动

    监听页面滚动 在methods中定义一个方法 handleScroll() { //获取滚动时的高度 let scrollTop = window.pageYOffset || document.do ...

  5. js判断json对象是否包含key

    if(json.hasOwnProperty("KEY")){ }

  6. tensorflow按需分配GPU问题

    使用tensorflow,如果不加设置,即使是很小的模型也会占用整块GPU,造成资源浪费. 所以我们需要设置,使程序按需使用GPU. 具体设置方法: gpu_options = tf.GPUOptio ...

  7. Python学习(六)—— 函数、全局变量与局部变量

    函数 函数的定义 def test(x): "The function definition" x += 1 return x def:定义函数的关键字 test:函数名 ():内 ...

  8. POJ 2142 The Balance(exgcd)

    嗯... 题目链接:http://poj.org/problem?id=2142 AC代码: #include<cstdio> #include<iostream> using ...

  9. 计算机二级-C语言-对二维数组数据进行处理。对文件进行数据输入。形参与实参。

    //函数fun的功能为:计算x所指数组中N个数的平均值(规定所有数都为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并输出. //重难点:形参与实参之间,是否进行了 ...

  10. 区块链学习——HyperLedger-Fabric v1.0 启动过程分析

    本章我们从fabric v1.0的e2e_cli示例开始分析整个启动过程以及在过程中的一些配置文件 首先呢,还是确保你的基本环境已经搭建完成,v1.0源码和镜像也都下载完毕 fabric启动过程中的相 ...