【发布时间】:2016-08-21 16:50:37
【问题描述】:
在我当前的项目中,我有想要在环境中移动的 Actor。不同的Actor可能有不同的运动策略,我将这些策略作为依赖注入到Actor中,如下所示(与语言无关):
actor = new Actor(new Strategy());
但是,策略需要能够根据 Actor 的状态(例如其当前位置、健康状况等)做出决策。因此,需要将 Actor 注入到 Strategy 中,这显然是一个糟糕的设计,因为它是循环依赖。
在阅读this article 之后,我尝试从 Actor 中提取一些状态信息到一个名为 State 的新类中,现在有一个如下所示的依赖模型:
state = new State();
strategy = new Strategy(state);
actor = new Actor(state, strategy);
这消除了循环依赖。然而,在我的项目中,Actor 派生自一个已经具有状态信息(位置、健康状况等)的库类。因此,当 Actor 已经拥有该职责时,提取第三个 State 类实际上没有任何意义。 State 所做的就是从 Actor 那里获取状态,所以在最坏的情况下它们仍然是循环依赖的,或者在最好的情况下它们是强耦合的。
处理这种情况的最佳方法是什么?最后,我尝试将运动策略注入到 Actors 中,这些策略需要知道一些状态信息才能做出明智的决策,并且 Actor 扩展了一个包含状态的库类。
【问题讨论】:
标签: dependency-injection language-agnostic circular-dependency