控制反转(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
类。
在第二个代码示例中,我们通过在TextEditor
构造函数签名中使用SpellChecker
依赖类来创建抽象(不在类中初始化依赖项)。这允许我们调用依赖项,然后将其传递给 TextEditor 类,如下所示:
SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);
现在,创建TextEditor
类的客户端可以控制使用哪个SpellChecker
实现,因为我们将依赖项注入TextEditor
签名。
这只是一个简单的例子,Simone Busoli 有一系列很好的文章更详细地解释了它。
控制反转是程序回调时得到的结果,例如 gui 程序。
例如,在旧学校菜单中,您可能有:
print "enter your name"
read name
print "enter your address"
read address
etc...
store in database
从而控制用户交互的流程。
在 GUI 程序或某些程序中,我们说:
when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase
因此,现在控制被反转... 用户不是以固定顺序接受用户输入,而是控制输入数据的顺序,以及何时将数据保存在数据库中。
基本上,具有事件循环,回调或执行触发器的任何内容都属于此类别。
什么是控制倒置?
如果您按照这两个简单的步骤操作,那么您已完成控制反转:
根据您实施所使用的技术 / 语言,每种步骤都有几种可能的技术。
-
控制反转(IoC)的反转部分是令人困惑的事情; 因为反演是相对的术语。理解 IoC 的最好方法就是忘掉那个词!
-
例子