2010-02-02 16 views
1

主观观察者关系不是依赖关系:观察者不需要需要主题为了存在,反之亦然。然而,发布者和订阅者的“连接在一起”强烈地让人想起依赖注入。是否有类似于依赖注入的模式将主题和观察者连接在一起?

我的射击游戏大量使用观察者模式。例如:

控制器对象在每轮开始时产生玩家对象。控制器要求工厂提供该船。除其他事项外,该船依赖于可能过热并摧毁船的反应堆物体。工厂注入这些依赖关系。到现在为止还挺好。

现在,HUD需要了解船舶的地位,特别是反应器温度,但HUD不上的DI意义上的船靠:船被摧毁后,HUD仍然存在。

问题是,假设控制器不具备HUD的参考,我怎样才能让HUD与船舶接触?这只是一个小小的例子。我有很多很多需要将事件传递给另一个的对象。

我觉得我可以在工厂做一些接线,但是感觉“错误”,并且在现有订阅需要改变的情况下无助。

无论如何,我所读到的关于观察者模式的一切都忽略了这个更广泛的问题。有一个确定的解决方案吗?

回答

0

您可能想要探索使用更通用的用途,如“事件聚合器”或中央消息/事件解除机制来执行此操作。这样,您的HUD就可以简单地订阅它关心的事件类型,您的船只可以根据需要提升/发送这些事件,而且两者都不需要知道其他事件。这是很好地分离事物的一种方法。

无法找到一个很好的所有功能于对您的站点,但这里的想法的讨论,因为它涉及到一个WinForms应用程序:http://www.lostechies.com/blogs/derickbailey/archive/2009/12/22/understanding-the-application-controller-through-object-messaging-patterns.aspx

+0

当然,使用Di容器可以使您的应用程序更容易编写有用的对象消息传递系统。这里有一篇文章讨论一些相关的问题(更多的关注于StructureMap的东西,但在消息/消息处理器领域):http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/01/07/先进-structuremap定制登记的约定换部分闭合-types.aspx – Pete 2010-02-02 20:05:58

0

实现设计模式,通常涉及自己编码的参与者:主题&观察者,在这种情况下。这些对象如何形成他们规定的关系的细节真的(通常)取决于你。您可以免费使用Spring DI(Java)或任何对您有意义的框架。

但我不确定这些关系是否是典型DI框架的良好饲料。你的主题 - 以及你的观察者 - 可能 - 将在游戏过程中经常进入/离开存在。

也许你还需要一些观察员来观察产生你的主题的工厂。这样他们就可以得到他们想要跟踪的新主题的通知,并将他们自己注册为观察者。

相关问题