首页 > 解决方案 > 事件、双重调度和抽象事件处理

问题描述

想象一个简单的双调度事件处理方案:

在此处输入图像描述

这个很酷。而且它有效。但是我在这里看到了几个问题:

  1. EventHandlerInterface 必须明确知道所有事件。
  2. 由于 (1) 处理程序可能会因为订阅未使用的事件而具有较大的空间开销。

我希望这个结构看起来更像这样:

在此处输入图像描述

如您所见,我希望不同模块产生单独的事件类型,并且我希望每个模块只实现必要的事件处理接口。我不知道如何将这一切联系在一起。理想情况下,我希望有一个准备好接受任何事件的 EventServices 列表。

我可以在这里想到的一件事是为每个 EventHandlerInterface 类型继承一个 EventService 并将事件处理程序向下转换为notify方法内部的某个类型。然而,它不是类型安全的,看起来像一个丑陋的想法。

我可以看到,第二种方法是将 EventService 设为模板并静态检查模板参数是否为 EventHandlerInterface 的子项。那将是类型安全的,并且几乎可以满足我的要求。但是,这样我就不能按照我的意愿将所有 EventServices 存储到一个列表/向量中。因此,这种方法是不可取的。

实际上,感觉就像我在寻找错误的方式,但我不知道如何找到正确的方式。

谢谢!

标签: c++eventsarchitecture

解决方案


我不确定访问者模式是解决这个问题的正确方法。当然,它为您提供了一种实现双重分派的机制,但仅此而已,并且正如您所说,它有缺点,例如访问者(EventHandlerInterface)必须为每种不同类型的主机(EventInterface)提供重载。这会产生紧密耦合,并且仅在您很少将类添加到主机层次结构时才有意义。

为什么不根据发布-订阅模式寻求解决方案?它允许松散耦合并避免冗余接口的需要。简而言之,发布者提供了一些订阅者可以订阅的事件。当一个事件被触发时,订阅者会被通知并处理它。订阅者只订阅他们认为相关的事件。不同的订阅者可以为相同类型的事件提供不同的处理,这似乎是您的情况下双重调度的目的。

在许多语言(例如 C#)中,有一种特殊的语法可以轻松地支持这种模式。在 C++ 中,您需要使用诸如boost 信号之类的库,尽管还有其他库。另请参阅此处以获取示例。


推荐阅读