class="markdown_views prism-atom-one-light">
监听器模式
在编程的世界中,监听无所不在,譬如你点击一个音乐播放器的播放按钮,就播放一首音乐;点击相机的拍照按钮,就拍一张照片。也就是你触发某种行为,便会执行具体的动作。
监听器模式有三个要素——事件源、事件对象、监听器。
事件源: 顾名思义,事件发生的源头,比如点击的按钮,属于被监听的对象;
事件对象: 这个经常和事件源混淆,它经常被用来包装事件源,切记,它毕竟是个事件,比如点击事件,和事件源的区别自己感受,木有栗子;
监听器: 这个是监听器模式的核心,定义事件发生后的动作,通常事件对象作为监听器中定义的函数入参。
第一步,添加事件对象ClickEvent。
package listener;
import java.util.EventObject;
public class ClickEvent extends EventObject {
private int id;
public final static int SINGLE_CLICK = 1;
public final static int DOUBLE_CLICK = 2;
public ClickEvent(Object source){
super(source);
}
public ClickEvent(Object source,int id){
super(source);
switch(id){
case SINGLE_CLICK:
this.id = SINGLE_CLICK;
break;
case DOUBLE_CLICK:
this.id = DOUBLE_CLICK;
break;
}
}
public int getId(){
return this.id;
}
}
第二步,定义一个时间监听器OnClickListener。
package listener;
import java.util.EventListener;
public interface OnClickListener extends EventListener {
void click(ClickEvent clickEvent);
void doubleClick(ClickEvent clickEvent);
}
第三步,定义一个事件源Button。
package listener;
import java.util.EventObject;
public class Button {
private OnClickListener clickListener;
public void setClickListener(OnClickListener clickListener){
this.clickListener = clickListener;
}
public void handleEvent(EventObject e) {
if (e instanceof ClickEvent) {
ClickEvent event = (ClickEvent)e;
switch(event.getId()){
case ClickEvent.SINGLE_CLICK:
this.clickListener.click(event);
break;
case ClickEvent.DOUBLE_CLICK:
this.clickListener.doubleClick(event);
break;
}
}
}
}
第四步,添加一个事件源产生的对象。
package listener;
public class EventSource implements OnClickListener {
public Button testOnClick() {
final Button button = new Button();
button.setClickListener(this);
return button;
}
@Override
public void click(ClickEvent clickEvent) {
System.out.println("鼠标单击事件: " + clickEvent.getId());
}
@Override
public void doubleClick(ClickEvent clickEvent) {
System.out.println("鼠标双击事件: " + clickEvent.getId());
}
}
第五步,添加测试方法。
package listener;
public class Main {
public static void main(String[] args) {
final EventSource eventSource = new EventSource();
Button button = eventSource.testOnClick();
ClickEvent clickEvent = new ClickEvent(EventSource.class, ClickEvent.SINGLE_CLICK);
button.handleEvent(clickEvent);
}
}
第六步,输出
鼠标单击事件: 1
监听器监听自己感兴趣的事件,一旦该事件被触发或改变,立即得到通知,做出响应,监听器一般是接口,用来约定调用的方式。当事件源对象上发生操作时,它会将调用事件监听器的一个方法,并在调用该方法时传递事件对象过去。事件监听器实现类通常是由开发人员编写,开发人员通过事件对象拿到事件源,从而对事件源上的操作进行处理。
观察者模式原理和监听器一样的,使用的关键在搞清楚什么是观察者、什么是被观察者。观察者(Observer)相当于事件监听器。被观察者(Observable)相当于事件源和事件,执行事件源通知逻辑时,将会回调Observer的回调方法update,只是在观察者模式中常用的是反射,而在监听器模式中使用的是callback。
浅谈状态模式
浅谈建造者模式
浅谈工厂模式
浅谈代理模式
浅谈适配器模式