观察者模式 源-监听器(Source/Listener)模式
事件监听器模式重要的三个概念:事件+事件监听器+事件源
$("#div").addEventListener("click",function(event){});
事件源:$("#div") 即id = div的html元素
事件:click事件对应的对象
事件监听器:function(event){ } 匿名函数
- 初始化事件源类,事件监听器所在的类(实现接口EventListener),事件类(继承EventObject类)。
- 对于每一个事件,都分为更为具体的事件(如点击事件,分为双击和单击。加载事件,分为开始加载,成功加载,加载异常,关闭页面等事件)。点击事件对应ClickEvent,其种类可以分为DoubleClick和SingleClick事件(通常使用ClickEvent类的类常量表示)。而ClickEvent事件则对应ClickEventListener事件监听器,更为具体的DoubleClick事件对应ClickEventListener事件的doubleClick方法,而SingleClick事件对应ClickEventListener事件的singleClick方法。
- 确认要触发的事件,实例化事件类,ClickEvent,并且赋值其成员变量,是赋值其为DoubleClick还是SingleClick。
- 当事件源触发click事件的时候,通过条件判断(if-else/switch-case),则会使用ClickEventListener事件监听器。接下来继续判断click事件的类型和种类,如果是DoubleClick事件,则调用ClickEventListener类的doubleClick方法。如果是SingleClick事件,则调用ClickEventListener类的singleClick方法。
![](http://dl2.iteye.com/upload/attachment/0130/0253/728d6597-933a-38a6-bd5e-a838b9733925.png)
定义一个事件源:Page页面。事件源至少有两个方法, 一个是为自身添加事件监听器,一个是触发事件方法。 当触发事件时,会根据传入的事件获取事件类型。从而确定应该实例化哪一个事件监听器类,并且调用事件监听器的哪一个方法可能
1、事件。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。
/**
* 定义事件(状态)对象(该事件对象包装了事件源对象、作为参数传递给监听器、很薄的一层包装类):
* 所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的**对象
*/
public interface Event {
public void show();
}
//source—事件源对象—如在界面上发生的点击按钮事件中的按钮
//所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event
// 的对象 不管是click事件还是double click事件都会发生在按钮之上
public class EventImplement extends EventObject implements Event {
private EventSource source ;
public EventImplement(EventSource source){
super(source);
}
@Override
public void show() {
System.out.println();
}
}
事件监听器。实现java.util.EventListener接口,注册在事件源上,当事件源的属性或状态改变时,取得相应的监听器调用其内部的回调方法。
/**
* EventListener 代表不同的行为
* 如果不同的行为只需要添加不同的 EventListener 即可
* 事件的监听者,当事件被触发,所有监听这个事件的监听者将被通知,
然后执行自己的Action 响应动作。
*listener得到事件并进行处理
*/
public interface EventListener {
void onEvent(Event e);
}
/**
* 单击事件
*/
public class EventListenerImplement1 implements EventListener {
@Override
public void onEvent(Event e) {
System.out.println("single click event");
e.show();//回调
}
}
/**
* 双击事件
*/
public class EventListenerImplement2 implements EventListener {
@Override
public void onEvent(Event e) {
System.out.println("double click event");
e.show();
}
}
事件源。事件发生的地方,由于事件源的某项属性或状态发生了改变(比如BUTTON被单击、TEXTBOX的值发生改变等等)导致某项事件发生。换句话说就是生成了相应的事件对象。因为事件监听器要注册在事件源上,所以事件源类中应该要有盛装监听器的容器(List,Set等等)。
/**
* 被监听者的事件集合,可能是方法,提供事件的注册加入和移除功能。
* source生产事件并分发
* eventSource应该实现EventListener的onEvent方法
*/
public interface EventSource {
public void registerListener(EventListener e);
public void notifyEvent();
}
public class EventSourceImplement implements EventSource {
private Vector repository = new Vector();//监听自己的监听器队列
@Override
public void registerListener(EventListener e) {
repository.add(e);
}
//通知所有的监听器:直接调用对象里缓存repository的listener对象的onEvent方法,
//这样就把Event对象分发出去了
@Override
public void notifyEvent() {
Enumeration enums = repository.elements();
while(enums.hasMoreElements()) {
EventListener el = (EventListener)enums.nextElement();
el.onEvent(new EventImplement(this));
}
}
}
public class Test {
public static void main(String[] args){
EventSource source = new EventSourceImplement();
EventListener click = new EventListenerImplement1();
EventListener doubleClick = new EventListenerImplement2();
source.registerListener(click);
source.registerListener(doubleClick);
source.notifyEvent();
}
}
public class SafeListener {
private final EventListener listener;
private SafeListener() {
listener = new EventListener() {
public void onEvent(Event e) {
e.show();
doSomething(e);
}
};
}
void doSomething(Event e) {
}
public static SafeListener newInstance(EventSource source) {
SafeListener safe = new SafeListener();
source.registerListener(safe.listener);
return safe;
}
public static void main(String[] args){
EventSource source = new EventSourceImplement();
SafeListener safeListener = SafeListener.newInstance(source);
source.notifyEvent();
}
}
事件源:组件,例如Button
事件对象:event,例如MouseEvent类的对象 事件监听接口:EventListener,例如MouseListener
EventListener 接口是处理事件的主要方法。用户实现 EventListener 接口,并使用 AddEventListener 方法在 EventTarget 上注册其侦听器。用户还应该在使用完侦听器后从其 EventTarget 移除 EventListener。
MouseListener用于接收组件上“感兴趣”的鼠标事件(按下、释放、单击、进入或离开)的侦听器接口。(要跟踪鼠标移动和鼠标拖动,请使用 MouseMotionListener。)
旨在处理鼠标事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 MouseAdapter(仅重写所需的方法)。
然后使用组件的 addMouseListener 方法将从该类所创建的侦听器对象向该组件注册。当按下、释放或单击(按下并释放)鼠标时会生成鼠标事件。鼠标光标进入或离开组件时也会生成鼠标事件。发生鼠标事件时,将调用该侦听器对象中的相应方法,并将 MouseEvent 传递给该方法。