控制反转与好莱坞原则的混淆

Old*_*ool 7 c# java design-patterns dependency-injection design-principles

我正在阅读 Head First Design 模式并坚持好莱坞原则。早些时候我读到了控制反转,我理解的是,这是一个设计原则(有些人也称之为模式),通过它传统的程序流程从“高层模块调用低层模块”变为“低层模块调用高层模块” ”(通常通过抽象),因此我们可以对特定的低级模块具有非常低的依赖性,并且更改低级模块不会对我们的更高级别或接近业务模块产生任何影响。

但是当作者对好莱坞原则说了以下几句话时,我感到困惑:-

第 296 页

根据好莱坞原则,我们允许低级组件将自己挂接到系统中,但高级组件决定何时需要它们以及如何需要它们。换句话说,高级组件给了低级组件“不要打电话给我们,我们会打电话给你”的待遇。

在最后一行,据说高层组件给低层组件一个“不要打电话给我们,我们会打电话给你”的待遇。这意味着我们的高级组件实际上正在调用低级组件,因此这似乎打破了控制反转原则和依赖反转原则。

请澄清这一点。

D.J*_*omp 0

好莱坞原则与控制反转并不矛盾,尽管它可以在编程时忽略它。

在书中的咖啡示例(我猜一页之后,我有另一个版本)对通过好莱坞原则调用的两个方法进行了子类化。如果子类只是覆盖基类中的一些抽象方法,那么它并没有真正使用控制反转。

然而,由于被调用的子类可以调整基类的成员,因此它可以通过这种方式进行控制。在我书中前一页的问答中,它解释了这个问题:钩子真正应该用来做什么。我会尽力解释。

假设您有一个带有未排序列表的基类和对 print() 列表的调用。如果您有一个子类,可以通过钩子调用它来覆盖 print() ,那么该子类可能会决定首先对基类的实际列表进行排序,然后在需要时调用其他函数。通过这种方式,低级功能可以接管高级功能的控制。