简述控制反转ioc_什么是IoC控制反转

简述控制反转ioc_什么是IoC控制反转静态类的使用是一个有争议的话题,有人甚至提倡不要在类的名称上使用作用域限定符。关于静态特性争论的焦点在于一个被称为IoC控制反转的设计原则。IoC这个设计原则试图在面向对象编程中去掉所有相互依赖的现象。这个原则对于复杂的系统来说是很重要的。它使得对象具有更好的多态性和封装性。相互依赖的现象越少,就越容易单独测试某个组件。静态类与IoC之间的问题在于静态访问特性,这个特性从本质上来说,定义了两个类之…

大家好,又见面了,我是你们的朋友全栈君。

静态类的使用是一个有争议的话题,有人甚至提倡不要在类的名称上使用作用域限定符。关于静态特性争论的焦点在于一个被称为IoC控制反转的设计原则。

IoC这个设计原则试图在面向对象编程中去掉所有相互依赖的现象。这个原则对于复杂的系统来说是很重要的。它使得对象具有更好的多态性和封装性。相互依赖的现象越少,就越容易单独测试某个组件。

静态类与IoC之间的问题在于静态访问特性,这个特性从本质上来说,定义了两个类之间的绑定关系,因为类的名称是硬编码的。这就意味着在单独测试某个类的时候,这个类不容易被模拟。

就是说,静态类的使用会导致IoC设计原则受到限制。这是因为静态类的使用会导致类之间通过名称绑定在一起,这使得单独测试某个组件变得更加困难。

IoC的概念介绍

控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转。在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。

IoC(Inversion of Control)是近年来兴起的一种思想,不仅仅是编程思想。主要是协调各组件间相互的依赖关系,同时大大提高了组件的可移植性,组件的重用机会也变得更多。在传统的实现中,由程序内部代码来控制程序之间的关系。我们经常使用new关键字来实现两组键间关系的组合,这种实现的方式会造成组件之间耦合(一个好的设计,不但要实现代码重用,还要将组件间关系解耦)。IoC很好的解决了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在运行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部的容器来完成。即常说的好莱坞原则“Don’t call us, we’ll call you”。

Ioc也有称为DI(Dependecy Injection 依赖注射),由Martin Fowler的一篇《Inversion of Control Containers and the Dependency Injection pattern》提出。

分离关注(Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是组件Components,方面Aspects或服务Services。

从GOF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:

AInterface a = new AInterfaceImp();

AInterfaceImp是接口AInterface的一个子类,Ioc模式可以延缓接口的实现,根据需要实现,有个比喻:接口如同空的模型套,在必要时,需要向模型套注射石膏,这样才能成为一个模型实体,因此,我们将人为控制接口的实现成为“注射”。

Ioc英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你。

其实Ioc模式也是解决调用者和被调用者之间的一种关系,上述 AInterface实现语句表明当前是在调用被调用者AInterfaceImp,由于被调用者名称写入了调用者的代码中,这产生了一个接口实现的原 罪:彼此联系,调用者和被调用者有紧密联系,在UML中是用依赖 Dependency 表示。

但是这种依赖在分离关注的思维下是不可忍耐的,必须切割,实现调用者和被调用者解耦,新的Ioc模式 Dependency Injection 模式由此产生了, Dependency Injection模式是依赖注射的意思,也就是将依赖先剥离,然后在适当时候再注射进入。

一个IoC的例子

假设我们要设计一个Girl和一个Boy类,其中Girl有kiss方法,即Girl想要Kiss一个Boy。那么,我们的问题是,Girl如何能够认识这个Boy?

在我们中国,常见的MM与GG的认识方式有以下几种:1、青梅竹马;2、亲友介绍;3、父母包办

那么哪一种才是最好呢?

青梅竹马:Girl从小就知道自己的Boy。

public class Girl {

void kiss(){

Boy boy = new Boy();

}

}

然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办?(笔者严重不支持Girl经常更换Boy)

亲友介绍:由中间人负责提供Boy来见面。

public class Girl {

void kiss(){

Boy boy = BoyFactory.createBoy();

}

}

亲友介绍,固然是好。如果不满意,尽管另外换一个好了。但是,亲友BoyFactory经常是以Singleton的形式出现,不然就是,存在于Globals,无处不在,无处不能。实在是太繁琐了一点,不够灵活。我为什么一定要这个亲友掺和进来呢?为什么一定要付给她介绍费呢?万一最好的朋友爱上了我的男朋友呢?

父母包办:一切交给父母,自己不用费吹灰之力,只需要等着Kiss就好了。

public class Girl {

void kiss(Boy boy){

// kiss boy

boy.kiss();

}

}

Well,这是对Girl最好的方法,只要想办法贿赂了Girl的父母,并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。

这就是IOC,将对象的创建和获取提取到外部。由外部容器提供需要的组件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148622.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python 字典最外层使用_python字典底层实现

    python 字典最外层使用_python字典底层实现前言问题1:python中的字典到底是有序还是无序问题2:python中字典的效率如何python字典底层原理在Python3.5以前,字典是不能保证顺序的,键值对A先插入字典,键值对B后插

  • GitHub开源神器:教你如何实现 PDF 转 Word

    GitHub开源神器:教你如何实现 PDF 转 Word点击上方“Github爱好者社区”,选择星标回复“资料”,获取小编整理的一份资料作者:GG哥来源:GitHub爱好者社区(github_shequ)这是GitHub爱好者社区第34篇…

  • redis的incr和incrby命令

    redis的incr和incrby命令

  • iPhone4s完美越狱_苹果4越狱工具

    iPhone4s完美越狱_苹果4越狱工具通常我们所说iPhone激活成功教程实际上包含了很多内容在里面,激活成功教程的目的有很多,例如使用第三方软件,可以打电话,可以使用YouTube等等,其最终目的是可以实现所有的功能。在整个过程中的任何一步都可以叫做是激活成功教程,所以如果有网友单纯问如何激活成功教程这类问题实际上是很难回答的,因为不知道网友关心的是针对哪一部分的激活成功教程。因此本教程中凡是用到激活成功教程这个词的地方,都泛指各种激活成功教程方法,而对于特定的激活成功教程目的则用专门的词来描述…

  • EnterpriseLibrary 介绍[通俗易懂]

    EnterpriseLibrary 介绍[通俗易懂]创建数据库对象的方法http://tutuya.cnblogs.com/articles/441337.html

    2022年10月20日
  • 数学励志公式:每天进步一点点「建议收藏」

    数学励志公式:每天进步一点点「建议收藏」​数学的魅力真是无穷的,不信,你往下看!单纯的一个数学公式都可以作为你的励志名言,还不好好学数学吗?勤学如初起之苗,不见其增,日有所长辍学如磨刀之石,不见其损,日有所亏。等式11.01365=37.80.99365=0.031.01^{365}=37.8\\0.99^{365}=0.031.01365=37.80.99365=0.03等式21.02365=1377.40.98365=0.00061.02^{365}=1377.4\\0.98^{365}=0.0006

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号