Есть ли лучший способ обработки событий, чем последовательность if?

StackOverflow https://stackoverflow.com/questions/2542558

  •  23-09-2019
  •  | 
  •  

Вопрос

Недавно я столкнулся с несколькими объектами, реализованными для обработки событий с жестко закодированным сопоставлением с использованием этого шаблона:

public void handleEvent(Event event)
{
    if(event.getCode() == SOME_STATIC_EVENT)
        doSomething(event);
    if(event.getCode() == ANOTHER_STATIC_EVENT)
        doSomethingElse(event);
}

где функции doSomething реализованы как методы того же класса.

Как бы вы предложили абстрагировать этот шаблон в надежде добиться более слабой связи?Кроме того, как лучше всего сопоставить функции 0..N с запущенным событием?

Это было полезно?

Решение

Да, по сути, вам нужно создать структуру данных, которая сопоставляет тип события с интерфейсом.Вот простой пример, реализованный в виде карты.

EventHandlerInterface h;
// eventMap contains a mapping of event codes to
// implementations of EventHandlerInterface
h = eventMap.get(event.getCode());
if(h != null)
{
    h.handle(event);
}

Это дает вам возможность эффективно обрабатывать большое количество событий и динамически добавлять, удалять и переназначать события различным обработчикам.

Другие советы

Недавно был пост SOF, который был настолько похож и близок, что мой ответ здесь вполне может ответить на ваш вопрос.

Вместо исполняемого файла вы должны создать свой собственный интерфейс:

public abstract interface EventHandler
{
    public void run(Event event);
}

Вы можете начать с того, что сделаете код немного чище.Используйте локальную переменную, чтобы исключить повторяющиеся event.getCode().Переключитесь на перечисления, чтобы вы могли использовать switch.

Если есть повторяющийся шаблон, вы можете декодировать его в интерфейс обратного вызова с несколькими методами, как это делает AWT.

Я бы предложил, чтобы регистрация мероприятия стала более конкретной.Зарегистрируйте другой обратный вызов для каждого типа события.Даже если убрать из события код события и, возможно, удалить само событие.Под листами вы можете хранить код события для сопоставления с обработчиками, но он должен быть непрозрачным.Обратной стороной этого подхода является то, что анонимные внутренние классы в настоящее время (JDK6) очень многословны, а обработка классов неэффективна (время загрузки и занимаемая площадь).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top