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

}


}


/*

* 事件监听器,事件处理器

*/

public interface IEventListener {

void onclickButton();

}


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.  

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

二、完整模型的demo

/*

* 事件

*/

public interface IEvent {


void setEventListener(IEventListener arg);


boolean ClickButton();


boolean MoveMouse();


}


/*

* 事件监听器,调用事件处理器

*/

public interface IEventListener {


void doEvent(IEvent arg);

}


/*

* 事件源:事件发生的地点

*/

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;

}


}


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

}


}


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

}

}

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

展开阅读全文

没有更多推荐了,返回首页