作者: abruzzi
链接:http://abruzzi.javaeye.com/blog/266027
发表时间: 2008年11月12日
声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!
事件监听器模式(一个简单的例子)
在GUI程序设计中,在设计时通常不会知道用户的动作什么时候会发生,如用户可能点击某一
个按钮,也可能不点击,而且点击按钮的时机在运行时才可能知道。如果用传统的程序控制
方式,则很难做到准确的响应。通常这种情况或者类似的情况下,我们可以使用事件/监听器模式。
将一个监听器(listener)与特定的控件(如按钮等)绑定起来,当发生用户点击等事件(Event)时,
调用监听器的处理方法,从而响应用户的动作。是为事件/监听器模式。
事件有很多种,而且事件发生的时序是不确定的。可以简单的定义一个事件的接口,如下例:
interface Event{
static int event1 = 0;
static int event2 = 1;
static int event3 = 2;
...
int getEventType();
}
一个监听器的接口的一种可能形式:
interface listener{
void handleEvent(Event event);
}
实现监听器接口的类可以根据事件的类型作出具体的响应方式如:
class ListenerImpl implements Listener{
some other methods of this implementation;
...
void handleEvent(Event event){
switch(event.getEventType()){
case Event.event1:
doSomething();
break;
case Event.event2:
doSomethingElse();
break;
default:
break;
}
}
GUIThread thread = new GUIThread();
thread.setListener(this);//注册监听器
...
}
在GUI的主流程中,需要有一个Event的实现者,和一个发起事件的组件,如:
class EventImpl implements Event{
private int type;
public EnentImpl(int type){
this.type = type;
}
}
class GUIThread{
private Listener listener;
public void setListener(Listener listener){
this.listener = listener;
}
public void execute(){
if(this.listener != null){
Event event = new EventImpl(type);//触发了某事件
listener.handleEvent(event);
}
}
}
private int type;
public EnentImpl(int type){
this.type = type;
}
}
class GUIThread{
private Listener listener;
public void setListener(Listener listener){
this.listener = listener;
}
public void execute(){
if(this.listener != null){
Event event = new EventImpl(type);//触发了某事件
listener.handleEvent(event);
}
}
}
当然,这个实现只是一个原理性的描述,应该可以很容易根据这个描述作出自己的实现。关于事件的处理以及事件类型的定义等可以完全根据自己的需求定制。