【问题标题】:Events, double dispatching and abstract event handling事件、双重调度和抽象事件处理
【发布时间】:2019-01-21 21:02:34
【问题描述】:

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

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

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

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

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

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

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

实际上感觉就像我找错了方向,但我不知道如何找到正确的方向。

谢谢!

【问题讨论】:

  • 您可能对观察者模式或事件管理的“信号和槽”方法更感兴趣。当您通常对所有或大部分类型感兴趣时,访问者是很棒的。

标签: c++ events architecture


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!它看起来确实更适合我的任务。我也知道 Boost 信号/插槽,但不幸的是我需要嵌入式系统的模式,并且使用 Boost 可能会占用闪存使用量。如果你知道一些轻量级的模拟,如果你分享它,我将不胜感激。
  • 我没有评估过不同的库,所以不能说太多。通常我的标准是简单和易用。例如。在一个个人项目中,我使用 sigslots (sigslot.sourceforge.net),超级好用,只有一个标题。你检查过这个线程:stackoverflow.com/questions/359928/… 吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-02
  • 2014-01-05
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多