gpt4 book ai didi

C++ 观察者模式 : adding another dimension

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

我正在尝试在“智能建筑”系统设计(使用 STL 库)中实现此模式。放置在房间、楼层等处的各种“传感器”发送信号,这些信号由“ Controller ”(也放置在不同的房间、楼层等处)处理。我面临的问题是 Controller 对事件的订阅不仅是基于事件的,它也是基于位置的。

例如, Controller A 可以订阅来自 #4 楼 #1 房间的火警信号和 #5 楼的运动信号。基于楼层的订阅意味着 Controller A 将获得关于他订阅的楼层中每个房间的运动事件(假设适当的传感器放置在那里)。也有针对该问题的全楼订阅。

系统的拓扑结构是在启动时从配置文件中读取的,所以我不想映射整个建筑物,只映射包含传感器和 Controller 的相关位置。

我想到的:

选项 1:MonitoredArea 类,包含区域名称(Building1、Floor 2、Room 3)和一个 vector ,其中 vector 的索引是枚举事件类型, vector 的每个成员包含一个订阅此事件的 Controller 列表。该类还将包含指向父 MonitoredArea 的指针,如果它是楼层中的房间或建筑物中的楼层。

传感器类会将事件连同传感器名称一起发送到中心集线器。集线器将通过他的传感器名称到位置映射运行它,获取匹配的 MonitoredArea 并将警告 vector 中的所有 Controller 。

缺点:

  • 位置与 Controller 的耦合
  • 事件被枚举并硬编码在 MonitoredArea 类中,添加 future 事件很困难。 enter image description here

选项 2:将所有订阅保留在 Controller 类中。

缺点:

  • 效率很低。每个事件都会使控制中心遍历所有 Controller 并找出哪些订阅了该特定事件。

选项 3:基于事件的功能。事件类(即 FireEvent)将包含它可能发生的所有位置(根据传感器的设置)以及每个位置的订阅它的 Controller 列表。

enter image description here

缺点:

  • map 中的 map
  • 强数据重复
  • 无法提醒基于楼层的订阅者有关各个房间中的事件。

如您所见,我对上述任何解决方案都不满意。我确信我已经到了过度思考的阶段,并且很乐意就我如何处理这个问题提供反馈或替代建议。谢谢。

最佳答案

在游戏开发中有一种设计模式(可以这么说)被大量使用,称为“消息总线”。它有时用于替代基于事件的操作。

“消息总线是一个或多个发送者和/或接收者之间的连接。可以把它想象成总线拓扑中计算机之间的连接:每个节点都可以通过将消息传递到总线来发送消息,所有连接的节点将收到该消息。是否处理节点以及是否发送回复完全取决于每个接收者自己。

将模块连接到消息总线给我们带来了一些优势:

每个模块都是独立的,不需要知道任何其他模块。每个模块都可以对发送到总线的任何消息使用react;这意味着您可以免费获得额外的灵 active ,而根本不会增加依赖性。遵循 YAGNI 工作流程要容易得多:例如,您要添加武器。首先实现物理,然后在渲染器中添加视觉效果,然后播放声音。所有这些功能都可以随时独立实现,而不会相互干扰。您无需过多思考如何将某些模块相互连接。有时需要花费大量时间,包括绘制图表/依赖关系图。”

资料来源: http://gameprogrammingpatterns.com/event-queue.html

http://www.optank.org/2013/04/02/game-development-design-3-message-bus/

关于C++ 观察者模式 : adding another dimension,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36101776/

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