2012-02-18 4 views
0

우리는 기본 클래스와 이벤트 리스너 approch를 사용하여 기본 클래스와 이벤트 리스너 인터페이스로 애플리케이션을 설계했습니다. 기본 클래스는 모든 작업을 호출 한 후 적절한 이벤트 리스너 메소드를 호출합니다. 내 구현을 작성이 작품 이후java의 이벤트 리스너

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 */ 
    } 
} 

을 : 다음과 같은

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

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

가 그럼 난 기본 클래스를 작성 :

import java.util.EventListener; 

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

    public void postOperation(); 
} 

그럼 내가 다음으로,이 인터페이스를 구현 : 코드를 따르는 것은 내 디자인을 보여줍니다 Base 클래스에 추가하고 operation_1 메소드를 구현하십시오. 나는 java.util.EventListener의 마커 인터페이스에서이 방법을 수행하지만, 설계 후 내 문제는 다른 클래스를 참조하십시오

  1. 추상 클래스 java.util의 패키지에 으로 EventListenerProxy합니다.
  2. EventListenerSupport org.apache.commons.lang3.event 패키지의 제네릭 클래스입니다.

나는이 클래스를 결코 사용하지 않는다. 나는 두 가지를 알고 싶어 :. 내 디자인에 대한

  1. 귀하의 의견을 (좋은 또는 나쁜)
  2. 가장 좋은 방법은 (가 말했다 클래스 또는 제 3 자 프레임 워크) 이벤트 리스너 접근

답변

1
.

특정 디자인이 어떤 문제를 해결할 지 모르는 채로 논의하는 것은 어렵습니다.

어쨌든 디자인의 주요 문제점은 하나의 리스너 만 가질 수 있다는 것입니다. EventListenerSupport을 사용하면 여러 것을 쉽게 지원할 수 있으며 추가/제거 리스너 메소드를 구현하기가 쉽습니다.

또 다른 문제점은 리스너 메소드가 이벤트를 매개 변수로 사용하지 않는다는 것입니다. 이로 인해 단일 청취자가 여러 개의 Base 인스턴스를 청취 할 수 없습니다. 이벤트를 사용하여 이벤트 소스를 감지 할 수 없기 때문입니다.

+0

내 수신기는 샘플이며 실제 수신기 메서드에는 매개 변수가 있습니다. – MJM

+0

그렇다면 실제 디자인을 보여주지 않고도 어떤 문제를 해결할 지 말하지 말고 디자인에 대해 논의 해 줄 것을 요청하셨습니까? –

+0

이벤트 리스너를위한 디자인은 모든 수업과 모든 인터페이스가 아닌 토론합니다. 그 이유는 크고 내 질문에 유용하지 않기 때문입니다. – MJM

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; 
    } 

} 

그것을 사용하는 가장 쉬운 방법은 구글 Guice이지만, 일부 자습서 주변에있다.