2012-02-18 140 views
0

我們使用基類和事件監聽器來處理我們的應用程序,從而獲得基類和事件監聽器接口。基類在調用任何操作後調用適當的事件偵聽器方法。下面的代碼顯示了我的設計:java中的事件監聽器

import java.util.EventListener; 

public interface MyEventListener extends EventListener 
{ 
    public void preOperation(); 

    public void postOperation(); 
} 

然後我實現這個接口如下:

class MyEventListenerImpl implements MyEventListener 
{ 
    @Override 
    public void postOperation() 
    { 
     System.out.println("Do previous operation"); 
    } 

    @Override 
    public void preOperation() 
    { 
     System.out.println("Do post operation"); 
    } 
} 

然後我寫基類如下:

abstract class Base 
{ 
    private MyEventListener eventListener; /* this member injected */ 

    public abstract void operation_1(); 

    public void doOperation_1() 
    { 
     eventListener.preOperation(); /* call listener before invoking main operation_1 implementation */ 

     operation_1(); /* call main operation_1 implementation */ 

     eventListener.postOperation(); /* call listener after invoking main operation_1 implementation */ 
    } 
} 
這些作品後

我寫我的實現Base類實現operation_1方法。 我本辦法由java.util.EventListener的標記接口而設計後,我的問題,看到另一個類:

  1. 抽象類EventListenerProxy將在java.util包中。
  2. EventListener支持org.apache.commons.lang3.event包中的泛型類。

我不知道從來沒有使用這些類。我想知道兩件事情:

  1. 您對我的設計意見(好或壞)
  2. 最佳實踐事件監聽器方法(由上述類或任何第三方框架)

回答

1

如果不知道應該解決哪個問題,很難討論某個特定的設計。

無論如何,你的設計的主要問題是你只能有一個監聽器。使用EventListenerSupport將允許輕鬆支持幾個,並且會使添加/刪除偵聽器方法變得不重要。

另一個問題是您的偵聽器方法不會將任何事件作爲參數。這使得單個監聽器不可能監聽幾個實例,因爲它不能使用該事件來檢測事件的來源。

+0

My Listener是示例和實際的偵聽器方法有參數。 – MJM 2012-02-18 12:52:28

+0

因此,您要求我們討論您的設計,而不告訴我們它打算解決哪個問題,並且不向我們展示您的實際設計? – 2012-02-18 12:54:19

+0

我討論了我設計的事件監聽器,並不是所有的類和所有的接口,因爲那些對於我的問題來說很大並且沒有用處。 – MJM 2012-02-18 12:56:49

0

EventListener本質上不能知道會發生,因爲在您的示例中它是從operation_1內部觸發的。

您正在尋找的是AOP方法攔截器。特別是aopalliances MethodInterceptor接口將是對你有用:

public Operation1Interceptor implements MethodInterceptor { 

    Object invoke(MethodInvocation invocation) throws Throwable { 

    /* feel free to access the arguments, if you wish */ 
    foo(invocation.getArguments()) 

    Object retval = invocation.proceed(); 

    /* Log it or do whatever you want */ 
    bar(retval); 

    baz(); 

    return retval; 
    } 

} 

使用最簡單的方法是谷歌吉斯,但也有周圍的一些教程。