在Observer模式中应用的控制反转

时间:2014-04-02 20:51:15

标签: design-patterns inversion-of-control observer-pattern

我试图完全理解控制反转(IoC)的含义,但我感觉我在互联网上遇到了相互矛盾的定义。

我发现控制反转的每一个解释都提到依赖注入(DI)。这种方式使我感到困惑,因为它使它看起来像是平等的。

根据我的理解,有几种类型的IoC没有明确提及。

从我理解的控制反转可能是:

1.高级组件调用抽象类型上的方法,这些方法执行编译时未知的特定于实现的代码(我仍然有问题看到"倒置"这里.Word 委托在这里似乎更贴切 - 我并不暗示 Delegator模式)。实现对象是在高级组件之外创建的,并且在它构造期间注入或使用setter方法(第2点)或在子类提供时使用 Template 模式(我已经看到)将此模式描述为工厂方法模式,这只会让我更加困惑。)

2.将抽象类型的实现注入高级组件的过程是IoC本身 - 只是另一种形式。这里的控制是倒置的"构造此高级组件的对象,或者在创建后使用依赖项注入它的对象。颠倒的话再次让我感到困惑。依赖注入似乎很恰当。

我部分地看到这里的控制反转基本上是"工作"由一些具体项目完成,主要组件只知道抽象类型,并且在主类之外创建这些对象(因此定义了具体工作)并且刚刚提供。我仍然无法将此视为委托。当我考虑它时,它意味着管理主(高级)组件的对象,即更高级别(mainer :))组件决定具体实现,因此术语反转不能指代低级组件从高级组件过度控制还是可以吗?

无论如何,它似乎与第3点非常不同。

3.Observer或回调模式。当某个事件发生时,某个对象要求稍后调用。这对我来说似乎是真正的控制倒置。因为observer / callbacks方法特别是观察者不使用的方法,而是控制流的其他一些对象。

我的推理是否正确?观察者模式是否也采用控制反转?依赖注入是控制反转的一种形式,就像我在第1点和第1点中提到的那样。 2?

2 个答案:

答案 0 :(得分:3)

我同意,倒置是一个误导性术语。是DI是IOC的一种形式。观察者模式使用DI,因为主体与对象(观察者)耦合,它需要在运行时通过观察者向主体注册自己来通知。

来自http://en.wikipedia.org/wiki/Inversion_of_control

  

控制反转(IoC)是一种编程技术,其中a   依赖对象在运行时耦合到它需要的对象。

     

在面向对象的编程中,有几种基本技术可用   实施控制反转。这些是:

Using a factory pattern
Using a service locator pattern
Using a dependency injection, for example:
    A constructor injection
    Parameter injection
    A setter injection
    An interface injection
Using a contextualized lookup
Using Template method design pattern
Using strategy design pattern

答案 1 :(得分:0)

也许因为这里的“控制”意味着不同,根据我的理解,IoC中的控制是指代码执行流程,数据检索或与实现细节相关的东西,而不是具体类的创建。

例如,在通过添加实现细节扩展框架时,框架决定何时调用实现方法或将数据发送给它们,而不是扩展类决定时间或如何自己获取数据。从这个方面来说,“控制”是颠倒的。