java的事件模型使用的是java的观察者模式.
subject对象
package
com.my.test.event;
/**/ /*
* Created on Nov 26, 2004 11:25:14 PM
*
* MyChangeEvent.java
**/
import java.util.EventObject;
/** */ /**
*
* @author wangzj
*
*/
public class MyEvent extends EventObject ... {
private String myname;
/** *//**
* @param source
*/
public MyEvent(Object source) ...{
super(source);
}
/**//*
* @param source myname
*/
public MyEvent(Object source, String myname) ...{
super(source);
this.myname = myname;
}
/**//*
* @return String
*/
public String getMyname() ...{
return myname;
}
}
/**/ /*
* Created on Nov 26, 2004 11:25:14 PM
*
* MyChangeEvent.java
**/
import java.util.EventObject;
/** */ /**
*
* @author wangzj
*
*/
public class MyEvent extends EventObject ... {
private String myname;
/** *//**
* @param source
*/
public MyEvent(Object source) ...{
super(source);
}
/**//*
* @param source myname
*/
public MyEvent(Object source, String myname) ...{
super(source);
this.myname = myname;
}
/**//*
* @return String
*/
public String getMyname() ...{
return myname;
}
}
观察者接口
package
com.my.test.event;
import java.util.EventListener;
/** */ /**
* @author violin
*
* Copyright www.yz21.org 2003-2004
*/
public interface MyListener extends EventListener ... {
/**//*
* @param event
*/
public void MyChanged(MyEvent event);
}
import java.util.EventListener;
/** */ /**
* @author violin
*
* Copyright www.yz21.org 2003-2004
*/
public interface MyListener extends EventListener ... {
/**//*
* @param event
*/
public void MyChanged(MyEvent event);
}
事件运行机制
package
com.my.test.event;
/**/ /*
* Created on Nov 26, 2004 11:32:01 PM
*
* MyClass.java
**/
import java.util.Iterator;
import java.util.Vector;
/** */ /**
* @author violin
*
* Copyright www.yz21.org 2003-2004
*/
public class MyClass ... {
private String name = "2004-9-27";
private static Vector myListeners = new Vector();
/** *//**
*
*/
public MyClass() ...{
super();
}
/**//*
* @param myname
*/
public void testMyEvent(String myname) ...{
this.name = myname;
notifyMyListeners();
}
/**//*
* @param listener add a listener;
*/
public void addMyListener(MyListener listener) ...{
myListeners.add(listener);
}
/**//*
* @param listener remove a listener;
*/
public void removeMyListener(MyListener listener) ...{
myListeners.remove(listener);
}
/**//*
* notify all listeners;
*/
private void notifyMyListeners() ...{
MyEvent event = new MyEvent(MyClass.class, name);
Iterator iterator = ((Vector) myListeners.clone()).iterator();
while (iterator.hasNext()) ...{
MyListener listener = (MyListener) iterator.next();
listener.MyChanged(event);
}
}
}
/**/ /*
* Created on Nov 26, 2004 11:32:01 PM
*
* MyClass.java
**/
import java.util.Iterator;
import java.util.Vector;
/** */ /**
* @author violin
*
* Copyright www.yz21.org 2003-2004
*/
public class MyClass ... {
private String name = "2004-9-27";
private static Vector myListeners = new Vector();
/** *//**
*
*/
public MyClass() ...{
super();
}
/**//*
* @param myname
*/
public void testMyEvent(String myname) ...{
this.name = myname;
notifyMyListeners();
}
/**//*
* @param listener add a listener;
*/
public void addMyListener(MyListener listener) ...{
myListeners.add(listener);
}
/**//*
* @param listener remove a listener;
*/
public void removeMyListener(MyListener listener) ...{
myListeners.remove(listener);
}
/**//*
* notify all listeners;
*/
private void notifyMyListeners() ...{
MyEvent event = new MyEvent(MyClass.class, name);
Iterator iterator = ((Vector) myListeners.clone()).iterator();
while (iterator.hasNext()) ...{
MyListener listener = (MyListener) iterator.next();
listener.MyChanged(event);
}
}
}
其实原理很简单,就是通过subject去调用观察者的方法,去触发事件方法.
此处的subject分类似乎不太合理,记不得了,大概思想是这样的了,哈哈
jsf中的ui组件的事件包括action和valuechanged事件都是使用这种模式,哈哈
只是他们多了一个标识接口FacesListener,作为actionListener和valuchagedListener的父接口!