首先定义事件接口,里面包含对几种事情类型的常量定义。
public interface EventSource {
public final int EVENT_TRUNON = 0x0;
public final int EVENT_TRUNOFF = 0x1;
public int getEventType();
}
然后定义一个具体的事件类型。
public class CookerEvent implements EventSource {
private String name;
private int level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@Override
public int getEventType(){
return EventSource.EVENT_TRUNON;
}
}
接着定义一个事件监听器的接口:
public interface EventListener {
/\*\*
\* 事件处理回调
*/
public void eventDispatched(CookerEvent event);
/\*\*
\* 事件类型是否匹配
\*
\* @param eventType
\* @return
*/
public boolean isRightEventType(int eventType);
}
然后再定义一个事件监听器的基类
public abstract class CookerEventListener implements EventListener {
public abstract void cooker(String name, int level);
@Override
public void eventDispatched(CookerEvent event) {
cooker(event.getName(),event.getLevel());
}
@Override
public boolean isRightEventType(int eventType) {
return eventType == EventSource.EVENT_TRUNON;
}
}
再定义一个客户端方法,该方法将定义一个addEventListener()方法将监听对象加入一个列表,然后执行相应的操作。
public class CookerClient {
private List<CookerEventListener> listener = new ArrayList<CookerEventListener>();
public void addCookerEventListener(CookerEventListener cookerEventListener){
this.listener.add(cookerEventListener);
}
public void excute(String name,int level){
for(CookerEventListener cookerEventListener:listener){
CookerEvent event = new CookerEvent();
event.setName("处理过的:"+name);
event.setLevel(level);
cookerEventListener.eventDispatched(event);
}
}
}
excute()方法里的代码表明,在执行完一部分操作后,调用监听器的事件分发(eventDispatched)方法,该方法通过多态的形式分别调用不同监听器子类的cooker()方法。
接下来,我们分别实现两个监听器的子类,用于监听到事件后要执行的动作,如下:
public class MyCookerEvent extends CookerEventListener {
@Override
public void cooker(String name, int level) {
System.out.println("myCookerEvent: name=" + name + ",level=" + level);
}
}
另一个监听器子类:
public class HisCookerEvent extends CookerEventListener {
private String time;
HisCookerEvent(String time){
this.time = time;
}
@Override
public void cooker(String name, int level) {
System.out.println("hisCookerEvent: name=" + name + ",level=" + level + ",his time is:" + this.time + "ms.");
}
public void setTime(String time) {
this.time = time;
}
public String getTime() {
return time;
}
}
调用的代码如下:
public static void main(String[] args) {
CookerClient cookerClient = new CookerClient();
/*加入两个监听器*/
cookerClient.addCookerEventListener(new MyCookerEvent());
cookerClient.addCookerEventListener(new HisCookerEvent("30"));
/*执行客户端调用,满足一定条件后通知上面的两个监听器*/
cookerClient.excute("haha",2);
}
类图如下: