【发布时间】:2018-01-31 13:48:42
【问题描述】:
我们有一个模块化架构,其中每个模块都作为事件生成器和事件观察者工作。一个模块可能同时产生多个事件。
我们可以有两种架构来处理事件:
-
为不同类型的事件维护一个观察者列表,并一一调用它们的处理程序。
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源代码有很好理解的人可以在这里帮助我。
【问题讨论】:
-
我看不出两者有什么区别,你只是把调度的职责放到了不同的位置上。除此之外,我想说生成 list of 事件很奇怪恕我直言。
-
@appleapple 我曾经在一个通过 TCP 进行外部通知的系统上工作。为了更有效地传输,我们曾经对事件稍作缓冲,因此发送了一个事件列表。
标签: c++ oop design-patterns event-handling epoll