gpt4 book ai didi

c++ - 适用于事件管理的设计模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:51 27 4
gpt4 key购买 nike

<分区>

我们有一个模块化架构,其中每个模块都充当事件生成器以及事件观察器。一个模块可以同时生成多个事件是可能的。

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

  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 源代码有很好理解的人可以在这里帮助我。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com