我的代码中有循环依赖项,我不确定如何解决。
我正在开发游戏。 NPC由三个部分组成,分别负责思考,感知和行动。这些组件需要访问NPC控制器才能访问其模型,但是控制器需要这些组件才能执行任何操作。因此,两者在其构造函数中将彼此作为参数。
ISenseNPC sense = new DefaultSenseNPC(controller, worldQueryEngine);
IThinkNPC think = new DefaultThinkNPC(sense);
IActNPC act = new DefaultActNPC(combatEngine, sense, controller);
controller = new ControllerNPC(act, think);
(以上示例对参数进行了简化。)
没有
act
和think
,controller
不能做任何事情,因此我不想允许没有它们的情况下对其进行初始化。反之亦然。我该怎么办?ControllerNPC
使用think
和act
更新其世界状态:public class ControllerNPC {
// ...
public override void Update(long tick)
{
// ...
act.UpdateFromBehavior(CurrentBehavior, tick);
CurrentBehavior = think.TransitionState(CurrentBehavior, tick);
}
// ...
}
DefaultSenseNPC
使用controller
确定是否与任何物体发生碰撞: public class DefaultSenseNPC {
// ...
public bool IsCollidingWithTarget()
{
return worldQuery.IsColliding(controller, model.Target);
}
// ...
}
最佳答案
使用接口将控制器的模型与具体的controllerService分开。
这是关于域驱动设计中的项目引用的,我早些时候写了一个有关此问题的小博客:
http://www.mellekoning.nl/index.php/2010/03/11/project-references-in-ddd/