2012-02-18 4 views
0

基本クラスとイベントリスナapprochを使用して、基本クラスとイベントリスナインタフェースを使用してアプリケーションを開発しています。基本クラスは、任意の操作を呼び出した後、適切なイベントリスナーメソッドを呼び出します。コードに続いて、私の設計を示しています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 */ 
    } 
} 

の基本クラスを実装し、operation_1メソッドを実装します。 は私がたjava.util.EventListenerマーカーインタフェースによって、このアプローチを行うが、設計した後、私の問題は、別のクラスを参照してください。java.utilのパッケージ内でEventListenerProxy

  1. 抽象クラスを。
  2. EventListenerSupport org.apache.commons.lang3.eventパッケージの汎用クラスです。

私はこれらのクラスを使用することは決してありません。 。私のデザインについて

  1. あなたのご意見(良いか悪いか)
  2. イベントリスナーアプローチのためのベストプラクティスを(クラスまたは第三者のフレームワークとして)

答えて

1
を:私は二つのことを知ってほしいです

特定のデザインについて、どの問題を解決するのかを知らなくても議論するのは難しいです。

とにかく、設計上の主な問題は、リスナーを1つしか使用できないことです。 EventListenerSupportを使用すると、複数のものを簡単にサポートでき、追加/削除リスナーメソッドを実装するのが簡単になります。

もう1つの問題は、リスナー・メソッドがイベントをパラメータとして受け取らないということです。これにより、イベントのソースを検出するためにイベントを使用することができないため、単一のリスナーが複数のBaseインスタンスをリッスンすることは不可能になります。

+0

マイリスナーはサンプルであり、実際のリスナーメソッドにはパラメータがあります。 – MJM

+0

あなたの設計をどのような問題が解決しようとしているのか、私たちにあなたの実際の設計を示すことなく伝えなくても、あなたの設計について議論するようお願いしますか? –

+0

イベントリスナーのデザインについては、すべてのクラスとすべてのインターフェイスではなく、私の質問には大したものではないため、議論します。 – MJM

0

事実上、イベントリスナーは、になることを知ることができません。この例では、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; 
    } 

} 

それを使用する最も簡単な方法は、GoogleのGuiceのですが、いくつかのチュートリアルが周りにあります。

関連する問題