我们有一个模块化架构,其中每个模块都用作事件生成器以及事件观察者。模块可能可以同时生成多个事件。
我们可以有两个处理事件的架构:
维护不同类型事件的观察者列表,并逐个调用其处理程序。
class Module{
vector<Module*> event_observer_list[CNT_OF_EVENTS];
int register(Module* observer, int event_type){
event_observer_list[event_type].push_back(observer);
}
void generate_event(list_of_event_indices){
for(auto event_index : list_of_event_indices){
for(auto i : event_observer[event_index])
event_observer_list[event_index][i]->handler(some_params);
}
}
int handler(some_params){
...
}
};
在这种情况下,我们必须多次为多个事件调用相同的观察者函数handler()
。即使我们写
对于每个事件的单独处理程序,我们可能必须执行一些常见任务(例如从中获取对象)
每个调用中的同步映射),这使得该架构非常有效。
维护所有事件的通用观察者列表。我们将逐个调用每个模块的处理程序。 如果模块没有查找某个特定事件,那么它将跳过处理。
class Module{
vector<Module*> event_observer_list;
int register(Module* observer){
event_observer_list.push_back(observer);
}
void generate_event(list_of_event_types){
for(i = 0 to event_observer_list.size()){
event_observer_list[i]->handler(some_params, list_of_event_types);
}
}
int handler(some_params, list_of_event_types){
...
}
};
这种架构也很有效,因为它让我们打电话给一些不必要的处理程序。
请在现有架构中提供任何可能的优化,或提供完全不同的设计解决方案。
epoll
(I / O事件通知工具)API提供与我正在寻找的类似的事件管理工具。它根据注册同时通知多个事件。我尝试过,但无法理解他们是如何管理它的。对epoll
源代码有深入了解的人可以帮助我。
答案 0 :(得分:1)
我不认为这有一些神奇的解决方案。您想要处理多个事件,并且希望它们由多个观察者处理。
一种可能的优化可能是针对有限数量的事件,其中每个不同事件的位标记与每个观察者的位标记匹配。例如观察者对事件1,3和5感兴趣(位:0x0015)。发送事件1,2和4(位0x000B),因此调用此观察者的处理程序,因为0x0015&amp; 0x000B不为零(事件1很常见)。
两种提议解决方案的效率差异主要取决于同时发送许多事件的可能性 如果在大多数情况下不是这种情况,那么每次事件只调用感兴趣的观察者在大多数情况下效率更高,因为至少并非所有处理程序都必须检查所有事件:每个事件只调用感兴趣的观察者。 /> 当大多数事件可能被发送并且您需要最高效率时(这假设大多数观察者将至少处理一个事件),它在负载下的效率可能会稍微降低。
我的偏好是第一种方法,因为虽然簿记有点复杂,但总体来说你可以更有效率地预期,尽管有些情况下方法2可能更适合。