У меня есть список событий, которые мне нужно запустить, когда пользователь выполняет действие, и менеджер событий, который запускает эти события.
Первоначально я использовал для явного запуска событий таким образом
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 и заставить его работать ...