我一直试图在上周解决这个问题并且似乎无法找到既不需要单例也不需要紧耦合的解决方案。
我正在开发一个3D太空游戏,其早期演示就在这里......
www.sugarspook.com/darkmatters/demo.html
......我已经到了添加任务的地步,玩家可以从平视显示器(Hud类)中选择。
游戏的结构是:
Game类包含Hud和ObjectsList类
ObjectsList类包含各种游戏对象,包括玩家,各种船,行星和轨道(空间站)。
当玩家进入轨道的一定距离内时,任务会被实例化
任务被添加到MissionsList类中,它本身在ObjectsList中
任务可能变得不可用并且在没有警告的情况下到期(就好像他们被另一名飞行员选中),因此Hud上显示的列表是动态的并且定期更新。
以前我已经让任务派遣事件到游戏,反过来告诉Hud变化。这对我来说似乎有些笨拙,因为Hud有各种更深层次的“层次”,信息需要传递给它。我最终在链条中一直有很多相同的功能。
我想到的解决方案涉及将对MissionsList类的引用注入到Hud中,使其能够从Missonslist中侦听更新。我听说将某些东西的状态与它的显示混合起来是不好的做法,但是我不知道如何将“现场”的任务列表添加到Hud中。相反,如果Hud仅包含显示细节而不参考生成这些细节的Mission对象,那么当玩家从Hud中选择任务时,我如何确定选择了哪个任务? 在这种情况下紧耦合好吗?或者我应该使用单身人士与Hud沟通? 如果有任何根本性的错误,我建议我欢迎被告知这是什么,什么是最好的解决方案。 感谢。
答案 0 :(得分:0)
嗯,简单的答案是为什么不通过中间接口耦合?
interface IMissionList
{
ObservableCollection<IMission> Missions{get;}
}
然后在你的依赖注入绑定到可以解析为实例,单例或常量等的东西......
然后将它注入你的Hud构造函数
Hud(IMissionList missionList){}
现在你松散地与合同相结合,实施 - 只要实施遵守合同,任何时候都可以改变。此外,由于注入你的Hud只需要关注它自己使用IMissionList而不是找到它。
[编辑]抱歉,这是C#,但希望这个想法有用。 See for actionscript interfaces和Dependency Injection for Actionscript