事件監聽器機制是觀察者模式的一種,通過把事件源和事件處理流程以監聽器的方法隔離開來,減小了主流程與被觸發事件的執行流程間的耦合,便于代碼的維護和對事件處理流程的擴充。
在事件監聽機制中,涉及到三個角色:事件、釋出者和監聽器
事件:在事件源和事件監聽器之間傳遞資訊的對象實體。
釋出者:在事件發生後,負責把事件釋出到監聽者的對象。
監聽者:監聽事件,并進行事件處理或轉發的對象。
Java中提供了事件監聽器實作的架構,使用Java中的事件監聽器,需要熟悉以下幾個類或接口:
1. EventObject:事件的基類,在Java中自定義事件時需要繼承的基類,其定義了事件源——Object類型的屬性,可以把發生事件所在的類執行個體的引用傳遞過來,以便于在事件處理流程中使用(如果有使用要求的話)。在自定義的事件中,還可以定義自己應用所需的其他屬性。
2. EventListener:自定義事件監聽器必須實作的接口,沒有具體方法,隻起到辨別作用。
Java事件的簡單實作如下(代碼參考Spring揭秘中自定義事件):
1. 定義事件:
package com.nuc.event;
import java.util.EventObject;
/**
* 定義事件對象,在該事件中除了繼承自父類EventObject的source屬性外,還自定義了
* 其他的一些屬性
*/
public class MethodExecutionEvent extends EventObject {
private static final long serialVersionUID = -641456338528520034L;
private String methodName;
private MethodExecutionStatus methodExecutionStatus;
public MethodExecutionEvent(Object source) {
super(source);
}
public MethodExecutionEvent(Object source, String methodName, MethodExecutionStatus methodExecutionStatus) {
super(source);
this.methodName = methodName;
this.methodExecutionStatus = methodExecutionStatus;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public MethodExecutionStatus getMethodExecutionStatus() {
return methodExecutionStatus;
}
public void setMethodExecutionStatus(MethodExecutionStatus methodExecutionStatus) {
this.methodExecutionStatus = methodExecutionStatus;
}
}
2. 定義監聽器接口及其實作
監聽器接口:
package com.nuc.listener;
import java.util.EventListener;
import java.util.EventObject;
public interface MethodExecutionEventListener extends EventListener {
void onMethodExecute(EventObject event);
}
監聽器實作:
package com.nuc.listener;
import java.util.EventObject;
import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;
/**
* 事件監聽器,定義當事件發生時會觸發的動作。但這裡的事件處理流程并不會被
* 事件源所在執行流程直接調用,而通過第三者——釋出者把事件傳遞過來
*/
public class MethodExecutionEventListenerImpl implements
MethodExecutionEventListener {
public void onMethodExecute(EventObject event) {
if (event instanceof MethodExecutionEvent) {
if (MethodExecutionStatus.BEGIN.equals(((MethodExecutionEvent)event).getMethodExecutionStatus())) {
System.out.println("invoke start...");
}
if (MethodExecutionStatus.END.equals(((MethodExecutionEvent) event).getMethodExecutionStatus())) {
System.out.println("method end...");
}
}
}
}
3. 定義釋出者
package com.nuc.publisher;
import java.util.EventObject;
import com.nuc.listener.MethodExecutionEventListener;
import com.nuc.listener.MethodExecutionEventListenerImpl;
/**
* 對事件觸發流程和事件執行流程進行解耦的重要元件,負責把把事件釋出到監聽器裡。
* 所謂的釋出即是把事件傳遞給監聽器。
*/
public class EventPublisher {
private MethodExecutionEventListener listener = new MethodExecutionEventListenerImpl();
public void publishEvent(EventObject event) {
listener.onMethodExecute(event);
}
}
4. 主流程釋出事件:
package com.nuc;
import com.nuc.event.MethodExecutionEvent;
import com.nuc.event.MethodExecutionStatus;
import com.nuc.publisher.EventPublisher;
public class App
{
public static void main( String[] args )
{
new EventPublisher().publishEvent(new MethodExecutionEvent("ok", "main", MethodExecutionStatus.BEGIN));
new EventPublisher().publishEvent(new MethodExecutionEvent("ok", "main", MethodExecutionStatus.END));
}
}
上面隻是java事件監聽器的最簡單的實作,在實際應用中還需要根據需要,定義适合的EventObject及處理流程。