适合事件管理的设计模式
Suitable design pattern for event management
我们有一个模块化的架构,其中每个模块都作为事件生成器和事件观察者。一个模块可以同时生成多个事件。
我们可以有两种架构来处理事件:
-
为不同类型的事件维护一个观察者列表,并逐个调用它们的处理程序。
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
了解的人可以在这里帮助我。
我认为这没有什么神奇的解决方案。 您希望处理多个事件,并且希望它们由多个观察者处理。
一种可能的优化可能是针对有限数量的事件,其中将每个不同事件的位标志与每个观察者的位标志进行匹配。 例如,观察者对事件 1、3 和 5 感兴趣(位:0x0015)。 发送事件 1、2 和 4(位0x000B),因此调用此观察器的处理程序是因为 0x0015 &0x000B 不为零(事件 1 很常见)。
两种所提出的解决方案的效率差异主要取决于同时发送许多事件的可能性。
如果大多数时候不是这种情况,那么在大多数情况下只为每个事件调用感兴趣的观察者更有效,因为至少不是所有的处理程序都必须检查所有事件:每个事件只调用感兴趣的观察者。
当大多数事件可能被发送并且您需要最大的效率时,在负载下的效率可能略低(这是假设大多数观察者将处理至少一个事件)。
我更喜欢第一种方法,因为尽管簿记有点复杂,但总的来说,您可以期望更有效率,尽管在某些情况下方法2可能更适合。
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 工厂设计模式优化
- 使用C++模板的数据映射器设计模式
- 为什么以及如何使用原型设计模式
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 在C++中创建观察器设计模式的好方法
- 现代C++在多大程度上消除了对设计模式的需求?
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- 下面抽象工厂设计模式的实现是正确的吗
- 适合事件管理的设计模式
- GUI软件设计模式,用于在运行时管理多个小部件
- 动画管理器设计模式