一尘不染

什么是控制反转?

oop

第一次遇到控制反转 (IoC) 时可能会非常混乱。

  1. 它是什么?
  2. 它解决了哪个问题?
  3. 什么时候适合使用,什么时候不适合?

阅读 150

收藏
2022-02-11

共1个答案

一尘不染

( Inversion-of-ControlIoC)模式是关于提供任何类型callback(控制反应),而不是直接行动(换句话说,反转和/或将控制重定向到外部处理程序/控制器)。( Dependency-InjectionDI)模式是 IoC 模式的一个更具体的版本,旨在从代码中移除依赖项。

每个DI实现都可以考虑IoC,但不应该调用它IoC,因为实现依赖注入比回调更难(不要通过使用通用术语“IoC”来降低产品的价值)。

对于 DI 示例,假设您的应用程序有一个文本编辑器组件,并且您想提供拼写检查。您的标准代码如下所示:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

我们在这里所做的创建了TextEditor和之间的依赖关系SpellChecker。在 IoC 场景中,我们将改为执行以下操作:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

在第一个代码示例中,我们正在实例化SpellChecker( this.checker = new SpellChecker();),这意味着TextEditor该类直接依赖于SpellChecker该类。

SpellChecker在第二个代码示例中,我们通过在 的构造函数签名中创建依赖类来创建抽象TextEditor(而不是在类中初始化依赖)。这允许我们调用依赖项,然后将其传递给 TextEditor 类,如下所示:

SpellChecker sc = new SpellChecker(); // dependency
TextEditor textEditor = new TextEditor(sc);

现在创建TextEditor类的客户端可以控制SpellChecker使用哪个实现,因为我们将依赖项注入到TextEditor签名中。

2022-02-11