1

上周我一直在努力解决这个问题,但似乎找不到既不需要单例也不需要紧耦合的解决方案。我正在开发一款 3D 太空游戏,这里有一个早期的
演示
......从平视显示器(Hud 类)中选择。

游戏的结构是:
Game 类包含 Hud 和 ObjectsList 类。
ObjectsList 类包含各种游戏对象,包括玩家、各种船、行星和轨道(空间站)。
当玩家到达轨道的一定距离内时,任务会被实例化。
任务被添加到一个 MissionsList 类,它本身在 ObjectsList 中。
任务可能会变得不可用并在没有警告的情况下过期(就好像它们被另一个飞行员选择了一样),因此显示在 Hud 上的列表是动态的并且会定期更新。
以前,我已经让任务将事件发送到 Game,而 Game 又将更改通知 Hud。这对我来说似乎有点笨拙,因为信息需要传递到 Hud 的各种更深层次的“层次”。我最终得到了很多相同的功能。

我正在考虑的解决方案是将 MissionsList 类的引用注入到 Hud 中,使其能够监听来自 Missonslist 的更新。我听说将某物的状态与其显示混合是一种不好的做法,但我不知道如何将任务的“实时”列表获取到 Hud。相比之下,如果 Hud 只包含显示细节而不参考生成这些细节的任务对象,那么当玩家从 Hud 中选择一个任务时,我如何确定选择了哪个任务?在这种情况下紧耦合可以吗?还是我应该使用单例与 Hud 进行通信?如果我建议的任何事情存在根本性的错误,我欢迎被告知那是什么以及最佳解决方案是什么。谢谢。

4

1 回答 1

0

那么简单的答案是为什么不通过中间接口耦合呢?

interface IMissionList
{
    ObservableCollection<IMission> Missions{get;}
}

然后在您的依赖注入中将其绑定到可以解析为实例、单例或常量等的东西...

然后将其注入您的 Hud 的构造函数中

Hud(IMissionList missionList){}

现在你松散地耦合到一个契约,它的实现可以在任何时候改变,只要实现遵守契约。此外,由于注入,您的 Hud 只需使用 IMissionList 而不是找到它。

[编辑] 抱歉,这是 C#,但希望这个想法有用。参见 actionscript 接口Actionscript 的依赖注入

于 2013-02-28T15:00:55.630 回答