适合事件管理的设计模式

Suitable design pattern for event management

本文关键字:设计模式 管理 事件      更新时间:2023-10-16

我们有一个模块化的架构,其中每个模块都作为事件生成器和事件观察者。一个模块可以同时生成多个事件。

我们可以有两种架构来处理事件:

  1. 为不同类型的事件维护一个观察者列表,并逐个调用它们的处理程序。

    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()。即使我们写 每个事件的单独处理程序,我们可能必须执行一些常见的任务(例如从中获取对象 同步映射)在每次调用中,这使得此体系结构高效。

  2. 维护所有事件通用的观察者列表。我们将逐个调用每个模块的处理程序。 如果模块没有查找某些特定事件,那么它只会跳过处理。

    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可能更适合。