在每个订阅者等待多种类型事件的发布 - 订阅系统中,是否有比简单交换更好的处理解决方案?
假设我们有2个发布者,Pub1和Pub2; Pub1发送两种类型的事件Pub1-eventA和Pub1-eventB,对于Pub2同样发送Pub2-eventA和Pub2-eventB
另一方面,我们有一个客户Sub1订阅Pub1和Pub2的事件;
您如何管理在Sub1侦听器中处理这些事件?
这里有一些可能性:
一个听众,一个大开关(难以维护):
Listener{
HandleEvent(event){
if(event.type == Pub1-eventA)
Action1.execute();
if(event.type == Pub1-eventB)
Action2.execute();
if(event.type == Pub2-eventA)
Action3.execute();
if(event.type == Pub2-eventB)
Action4.execute();
}
}
一个监听器和一个关联映射:
Map<event-type, Action> ActionMap
Listener{
Action = ActionMap[event-type]
Action.execute();
}
每个事件类型一个侦听器:
ListenerPub1-eventA{ check(event-type); Action1.execute(); }
ListenerPub1-eventB{ check(event-type); Action2.execute(); }
ListenerPub2-eventA{ check(event-type); Action3.execute(); }
ListenerPub2-eventB{ check(event-type); Action4.execute(); }
答案 0 :(得分:1)
在“一个侦听器,一个大开关”和“一个侦听器和一个关联映射”中,每个事件仍将以一个单独的方法结束,但您必须在代码中维护事件的调度。
发布 - 订阅消息传递系统最重要的贡献是使发布者和订阅者脱钩。因此,消息路由应该是您的中间件的责任。如果您的中间件无法进行消息路由,那么我建议每个事件类型使用一个侦听器,以便:
这就是我所能想到的。
我希望这会有所帮助。