介绍:
事件监听模式也叫事件监听机制。一般用在很多界面化编程中,比如当我们按下一个按钮时,会产生相应的反应,而这个按钮就是
事件源。而我们的程序有一个按钮
监听器 来监听按钮。
实时上,事件监听模式不属于23种设计模式,是 观察者模式 的一种实现。(http://blog.csdn.net/qq_25673113/article/details/52068680)
组成结构:
Java中的事件监听机制主要由事件源、事件对象、事件监听器三个部分组成。
1)事件源(event source):
具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。
2)事件对象(event object):
一般继承自java.util.EventObject类,封装了事件源对象以及与事件相关的信息。它是在事件源和事件监听器之间传递信息的。
3)事件监听器(event listener):
实现java.util.EventListener接口,需要注册在事件源上才能被调用。它监听事件,并进行事件处理或者转发。
观察者(Observer)相当于事件监听者,被观察者(Observable)或者说主题(Subject)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,同时可传被观察者和参数。
其实事件机制中的“事件对象”就相当于上例观察者模式中的notify中的String参数对象。
例子:
事件监听机制非常常用,所以jdk都帮我们实现了一系列接口,我们只要实现这些接口就可以了。(下面代码都是
伪代码,实际工程请慎重使用。。。。)
package Obser2;
import java.util.EventObject;
/**
* 点击事件
* @author lkj41110
*
*/
public class ButtonEvent extends EventObject{
//模拟坐标
private int x,y;
public ButtonEvent(Object source) {
super(source);
}
public String getButtonName(){
return source.toString();
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return getButtonName();
}
}
package Obser2;
import java.util.EventListener;
/**
* 事件监听器
* @author lkj41110
*/
interface IButtonListener extends EventListener{
//EventListener是所有事件侦听器接口必须扩展的标记接口、因为它是无内容的标记接口、
//所以事件处理方法由我们自己声明如下:
public void dealEvent(ButtonEvent event);
}
public class ButtonListener implements IButtonListener{
@Override
public void dealEvent(ButtonEvent event) {
System.out.println("监视器发现按钮 "+event+"在x:"+event.getX()+" y:"+event.getY()+"处按下");
}
}
package Obser2;
import java.util.ArrayList;
import java.util.List;
/**
* 事件源
* @author lkj41110
*/
public class MyBotton {
private List<IButtonListener> list=new ArrayList<IButtonListener>();
//注册监听器
private String name;
public MyBotton(String name){
this.name=name;
}
public void addActionListener(IButtonListener listener){
list.add(listener);
}
//取消监听器
public void removeActionListener(IButtonListener listener){
if(list.contains(listener)){
list.remove(listener);
}
}
//通知监听器
private void notifyListener(ButtonEvent event){
for(int i=0;i<list.size();i++){
list.get(i).dealEvent(event);
}
}
//按下按钮
public void press(int x,int y){
System.out.println("按下一个按钮");
ButtonEvent event=new ButtonEvent(this);
event.setX(x);
event.setY(y);
notifyListener(event);
}
@Override
public String toString() {
return name;
}
}
package Obser2;
public class Test {
public static void main(String[] args) {
//创建一个事件源,也就是按钮
MyBotton button=new MyBotton("按钮1");
ButtonListener listener1=new ButtonListener();
button.addActionListener(listener1);
//在1,2处按下
button.press(1, 2);
//可以方便使用匿名内部类
button.addActionListener(new IButtonListener() {
@Override
public void dealEvent(ButtonEvent event) {
System.out.println("我是监视器 ");
System.out.println("发现按钮 "+event+"在x:"+event.getX()+" y:"+event.getY()+"处按下");
System.out.println("!!!!");
}
});
button.press(10,10);
button.removeActionListener(listener1);
button.press(2, 4);
}
}
结果:
按下一个按钮
监视器发现按钮 按钮1在x:1y:2处按下
按下一个按钮
监视器发现按钮 按钮1在x:10y:10处按下
我是监视器
发现按钮 按钮1在x:10y:10处按下
!!!!
按下一个按钮
我是监视器
发现按钮 按钮1在x:2y:4处按下
!!!!
是不是从上面的例子里看到了观察者的模式的影子呢。
当然我们这里的button和jdk中的按钮还是很多不一样的,有兴趣的朋友可以可以去研究一下代码。