Шаблон дизайна реестра событий? - PullRequest
1 голос
/ 29 октября 2010

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

Первоначально я использовал для явного запуска событий таким образом

EventManager.publish(new SendNotificationEvent())

Затем я хотел изменить это на что-то вроде

EventManager.publishSendNotificationEvent()

. Для этого мне нужно динамически загрузить класс «SendNotificationEvent», создать его экземпляр и запустить событие.Работа с ClassLoder динамически использует отражение, медлительность и боль, с которой приходится иметь дело.Поэтому я подумал о регистрации события, когда корневой класс Event загружен

Event {
 Map registry = [:]
 static {
   registry["SendNotificationEvent"] = SendNotificationEvent.class
 }

 Class get(String key) {
    return registry[key]
 }
}

, и изменил управление событиями для разрешения класса события через Event

EventManager {
 Class $static_methodMissing (String name, args) {
    def event Event.get(name-"fire").metaClass.invokeConstructor(args)
    fire(event)
 }
}

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

  • ken

1 Ответ

0 голосов
/ 01 ноября 2010

Мне нравится ваш первый путь лучше (и я должен согласиться с комментарием FabrizioM - почему?)

Мне нравится EventManager.publish(new SendNotificationEvent()), потому что EventManager ничего не знает о событиях;это сделает вашу систему намного проще в обслуживании (и т. д.).

Кодирование - это форма упражнения: если оно начинает болеть, вам следует прекратить.

...