Answers
之前我看各种代码也不理解,后来看了一篇博文就懂了,个人觉得比各种示例代码都有用:客户程序员使用库,框架使用客户程序员。这就是控制是否被反转了的区别。控制反转是框架和库的关键区别所在。对于一个库而言,用户程序员使用的方式是主动调用它,这是通常情况的做法,也就是“正向”控制;而对于一个框架,往往将用户程序员编写的代码注册到框架中,最后由框架来调用用户程序员编写的代码,这就构成了控制反转。也就是说,控制反转的关键在于“控制者”是谁。对于一个库而言,复用的可能只是算法和数据结构;而对于一个框架而言,复用的往往还有控制流逻辑,这也是控制反转的结果。
引用
假发小太郎
answered 9 years ago
先看下没有IOC的情况:
//没有IOC的情况
class Project {
//实现一个java开发者和php开发者,省略其方法实现部分
JavaDeveloper javaer = new JavaDeveloper(){...};
javaer.coding();
}
可以看到Project是依赖于JavaDeveloper的,这时如果需求突然变了,java开发者被赶出团队,进来php开发者,只能硬改Project类了:
//将原来的JavaDeveloper修改如下:
PhpDeveloper phper = new PhpDeveloper(){...};
phper.coding();
这里的坏处是,一旦项目变得复杂,Developer会越来越多,这样每次变动都会导致Project类必须修改.甚至后期有了新的需求,要求这个Developer可以根据需求随时更换,怎么办?
现在看有IOC的情况:
//先产生一个Developer接口
interface Developer(){
coding();
}
class Project {
//在IOC的情况中,通常使用setter的方式注入这个developer
Developer dever = null;
setDevloper(Developer developer){
this.dever = developer;
}
//这里不用担心dever为null的问题,
//IOC框架会在Project对象初始化时用set方法把developer注入进来,
//当然除了setter方式还可以在构造函数中注入.
dever.coding();
}
class PhpDeveloper implements Developer(){
coding(){...}
}
class JavaDeveloper implements Developer(){
coding(){...}
}
此时Project不再依赖于JavaDeveloper了,外部有一个xml来管理注入的内容,这里是片断:
<!-- 这里可以随时切换为JavaDeveloper -->
<Developer>PhpDeveloper</Developer>
此时,依赖关系被提到了Project的上层,这就是控制反转, 而各种Developer通过依赖注入的方式实现了这一目标.
顺便说一下,除了spring可以实现IOC,其实简单的IOC自己写点代码也能实现,无非是读配置生成对象再注入而已,除了JAVA的IOC,其他各种语言也都有IOC的解决方案.
kanloli
answered 9 years ago
在这样一个前提下,你怎么去操作一个题材一个内容,那就要用你自己的艺术创作方式
[url=https://168won.com/view/fcssq/index.html]福彩双色球结果[/url]
[url=https://168won.com/view/shishicai_xy/ssc_index.html]幸运时时彩走势图[/url]
[url=https://168won.com/view/xingyft/pk10kai.html]幸运飞艇直播[/url]
[url=https://168won.com/view/fcssq/index.html]福彩双色球结果[/url]
[url=https://168won.com/view/shishicai_xy/ssc_index.html]幸运时时彩走势图[/url]
[url=https://168won.com/view/xingyft/pk10kai.html]幸运飞艇直播[/url]
lesliehuang
answered 2 years, 4 months ago