我有一个事件列表,我需要在用户执行操作时触发事件,以及触发这些事件的事件管理器。
最初我曾经以这种方式明确地发射事件
EventManager.publish(new SendNotificationEvent())
然后我想将其更改为
EventManager.publishSendNotificationEvent()
要做到这一点,我需要动态加载类“SendNotificationEvent”,实例化它并触发事件。处理ClassLoder会动态地使用反射,缓慢和痛苦来处理。所以我想到在加载根类Event时注册事件
Event {
Map registry = [:]
static {
registry["SendNotificationEvent"] = SendNotificationEvent.class
}
Class get(String key) {
return registry[key]
}
}
并更改事件管理以通过事件
解析事件类EventManager {
Class $static_methodMissing (String name, args) {
def event Event.get(name-"fire").metaClass.invokeConstructor(args)
fire(event)
}
}
这是一个好方法,是否有一种设计模式可以用来更好地做到这一点,或者我应该忍受ClassLoader的痛苦并让它工作......
答案 0 :(得分:0)
我更喜欢你的第一种方式(我必须同意FabrizioM的评论 - 为什么?)
我喜欢EventManager.publish(new SendNotificationEvent())
,因为EventManager
对事件一无所知;这将使您的系统更容易维护(等)。
编码就像一种运动形式:如果它开始受伤,你应该停止。