天天看點

java事件監聽器

事件監聽器機制是觀察者模式的一種,通過把事件源和事件處理流程以監聽器的方法隔離開來,減小了主流程與被觸發事件的執行流程間的耦合,便于代碼的維護和對事件處理流程的擴充。

在事件監聽機制中,涉及到三個角色:事件、釋出者和監聽器

事件:在事件源和事件監聽器之間傳遞資訊的對象實體。

釋出者:在事件發生後,負責把事件釋出到監聽者的對象。

監聽者:監聽事件,并進行事件處理或轉發的對象。

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及處理流程。