Слушатель событий в Java - PullRequest
       17

Слушатель событий в Java

0 голосов
/ 18 февраля 2012

Мы разработали наше приложение с базовыми классами и обработчиком событий Listener, таким образом, базовый класс и интерфейс прослушивателя событий.базовый класс вызывает соответствующий метод прослушивателя событий после вызова любой операции.Следующий код показывает мой дизайн:

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. лучшая практика для Приемника событий подход (указанным классом илилюбые сторонние фреймворки)

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

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

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

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

0 голосов
/ 31 октября 2014

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

То, что вы ищете, это перехватчики метода АОП. Особенно вам будет полезен интерфейс MethodInterceptor aopalliances:

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, но есть несколько учебных пособий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...