c++ - 事件、双重调度和抽象事件处理
问题描述
想象一个简单的双调度事件处理方案:
这个很酷。而且它有效。但是我在这里看到了几个问题:
- EventHandlerInterface 必须明确知道所有事件。
- 由于 (1) 处理程序可能会因为订阅未使用的事件而具有较大的空间开销。
我希望这个结构看起来更像这样:
如您所见,我希望不同模块产生单独的事件类型,并且我希望每个模块只实现必要的事件处理接口。我不知道如何将这一切联系在一起。理想情况下,我希望有一个准备好接受任何事件的 EventServices 列表。
我可以在这里想到的一件事是为每个 EventHandlerInterface 类型继承一个 EventService 并将事件处理程序向下转换为notify
方法内部的某个类型。然而,它不是类型安全的,看起来像一个丑陋的想法。
我可以看到,第二种方法是将 EventService 设为模板并静态检查模板参数是否为 EventHandlerInterface 的子项。那将是类型安全的,并且几乎可以满足我的要求。但是,这样我就不能按照我的意愿将所有 EventServices 存储到一个列表/向量中。因此,这种方法是不可取的。
实际上,感觉就像我在寻找错误的方式,但我不知道如何找到正确的方式。
谢谢!
解决方案
我不确定访问者模式是解决这个问题的正确方法。当然,它为您提供了一种实现双重分派的机制,但仅此而已,并且正如您所说,它有缺点,例如访问者(EventHandlerInterface)必须为每种不同类型的主机(EventInterface)提供重载。这会产生紧密耦合,并且仅在您很少将类添加到主机层次结构时才有意义。
为什么不根据发布-订阅模式寻求解决方案?它允许松散耦合并避免冗余接口的需要。简而言之,发布者提供了一些订阅者可以订阅的事件。当一个事件被触发时,订阅者会被通知并处理它。订阅者只订阅他们认为相关的事件。不同的订阅者可以为相同类型的事件提供不同的处理,这似乎是您的情况下双重调度的目的。
在许多语言(例如 C#)中,有一种特殊的语法可以轻松地支持这种模式。在 C++ 中,您需要使用诸如boost 信号之类的库,尽管还有其他库。另请参阅此处以获取示例。
推荐阅读
- python - 使用 lxml 和 python 请求进行抓取。
- opencl - 如何在主机程序循环中使用 opencl?
- php - 使用 MySQL 数据库中的详细信息从动态创建的一组图像中将数据动态传递给 Modal
- hibernate - 一对多映射创建 3 个表
- css - Css calc() 函数不适用于 sass 文件
- twincat - 有没有办法打印到输出控制台?(双猫3)
- python - ValueError:在 Keras 中使用自定义指标时的未知指标函数
- javascript - 从php中数组的输入文件列表中删除特定文件
- json - 如何制定最有效和最高效的逻辑来检查数据库中的数据是否存在?
- jquery - 单独修改select2下拉位置