Don't call us, we'll call you.
不要找我们,我们会找你。
我们经常把控制逻辑写在其他地方(例如:Framework)而非客户化的代码里,这样就可以更加专注于客户化逻辑,也就是说,外部逻辑负责调用客户化逻辑。在软件开发领域,我就叫它为控制反转。
例子:
- 在java标准库中,经常用到查找和排序这连个方法:binarySearch()和sort(),它们在执行的过程中会调用对象的compareTo()方法,或者调用我们传递的回调接口来比较大小,最终完成查找排序操作。binarySearch和sort就实现了控制反转。
- 经常提到的框架(Framework),它最典型的特点其实就是控制反转:框架抽象了通用流程,我们可以通过框架提供的规范(比如子类化抽象类或者实现相关接口)就可以把客户化代码植入流程中,完成各种制定的需求。时下流行的MVC框架,我们只需要实现相关Action、Form类以及相关的View,并配置好Action-Form-View的映射关系,这样每次客户端提交请求,该框架就会选择相应的Action去处理它,并根据返回的执行结果选择相应的View。这些控制逻辑是由框架为我们完成的。
狭义上的控制反转指的是服务、对象、组件的实例化和查找实现了控制反转。关于这方面的控制反转主要有两种形式
- Service Locator(服务定位器) 例如EJB中我们用javax.naming.InitalContex对象去查找
- Dependency Injection(依赖注入) 外部程序通过某种方式把服务对象注入到客户对象中使用的方法叫做依赖注入,注入的方式有很多:setter/constructor/annotation/interface/parameter/others