2012-02-18 3 views
0

Мы разрабатываем наше приложение с базовыми классами и абитуриентом Event Listener, таким образом, базовым классом и интерфейсом прослушивателя событий. базовый класс вызывает соответствующий метод прослушивания событий после вызова любой операции. Следующий код показывает мой дизайн:Слушатель событий в 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 интерфейс маркера, но после того, как дизайн моя проблема увидеть другой класс:

  1. Абстрактный класс EventListenerProxy в java.util пакете.
  2. EventListenerSupport общий класс в пакете org.apache.commons.lang3.event.

Я не знаю, как использовать этот класс никогда. Я хочу знать две вещи:.

  1. Ваше мнение о моей конструкции (хорошо или плохо)
  2. лучшая практика Event Listener подход (с помощью указанного класса или каких-либо рамок третьей стороны)

ответ

1
.

Трудно обсуждать конкретный дизайн, не зная, какую проблему он должен решить.

В любом случае, основная проблема с вашим дизайном в том, что у вас может быть только один слушатель. Использование EventListenerSupport позволило бы легко поддерживать несколько из них и сделало бы методы добавления/удаления слушателя тривиальными для реализации.

Другая проблема заключается в том, что ваши методы прослушивания не принимают какое-либо событие в качестве параметра. Это делает невозможным прослушивание одним слушателем нескольких экземпляров Base, поскольку он не может использовать событие для обнаружения источника события.

+0

My Listener - это образцы, а реальные методы слушателя имеют параметры. – MJM

+0

Итак, вы просите нас обсудить ваш дизайн, не сообщив нам, какую проблему он предназначен для решения, и не показывая нам ваш фактический дизайн? –

+0

Я обсуждаю свой проект для прослушивателя событий, а не всех классов и всего интерфейса, потому что те большие и не полезные для моего вопроса. – MJM

0

EventListener, по своей природе, не может знать, что что-то будет, потому что оно вызвано изнутри operation_1 в вашем примере.

Что вы ищете, это перехватчики метода АОП. Особенно 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, но есть некоторые учебники вокруг.

Смежные вопросы