简述控制反转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,将对象的创建和获取提取到外部。由外部容器提供需要的组件。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java的finalize方法干什么_Java finalize

    Java的finalize方法干什么_Java finalize我们通常用构造器来创建对象,而Finalize正好相反,构造方法执行对象的初始化操作,finalize方法执行对象的销毁操作.那我们什么时候需要使用finalize方法呢,我们都知道Java里垃圾回收器可以回收对象使用的内存空间,但是对象可能会持有很多资源比如Socket、文件句柄等,垃圾收集器无法回收这些资源,因此你需要使用finalize方法帮助GC回收这些资源,比如关闭打开的文件或者网元资源,删除临时文件等.一个例子Object类是所有类的父类,如果你去查看java.lang.Object类

    2022年9月19日
    2
  • 模型评估方法(混淆矩阵)「建议收藏」

    模型评估方法(混淆矩阵)「建议收藏」在数据挖掘或机器学习建模后往往会面临一个问题,就是该模型是否可靠?可靠性如何?也就是说模型的性能如何我们暂时不得而知。如果模型不加验证就使用,那后续出现的问题将会是不可估计的。所以通常建模后我们都会使用模型评估方法进行验证,当验证结果处于我们的可控范围之内或者效果更佳,那该模型便可以进行后续的进一步操作。这里又将面临一个新的问题——如何选择评估方法,其实通常很多人都会使用比较简单的错误率来…

    2022年5月15日
    48
  • Hadoop生态系统全面介绍

    Hadoop生态系统全面介绍Hadoop 作为大数据的分布式计算框架 发展到今天已经建立起了很完善的生态 本文将一一介绍基于 Hadoop 生态的一系列框架和组件 Flume 简介 Flume 是一个分布式 高可用的服务 用于高效收集 聚合和移动大量日志数据 作用 Flume 主要承载的作用是收集各个数据源的事件或日志数据 然后将其 Sink 到数据库架构 Flume 的实现架构原理也非常简单 通过 Agent 代理来实现数据的收集 一个 Agent 包含了 Source channel Sink 三个组件 Source 采集的数据来源

    2025年8月22日
    1
  • STM32F103笔记(一)[通俗易懂]

    STM32F103笔记(一)[通俗易懂]STM32的概述STM32的简述stm32系列的命名规律STM32F1系列芯片介绍关于查找资料-如果查找IO口是否独立,可查看《精英版IO引脚分配表》如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLo…

    2022年10月10日
    2
  • 编程实现strstr函数「建议收藏」

    编程实现strstr函数「建议收藏」函数接口为:char*mystrstr(char*str1,char*str2)要求:在字符串str1中查找第一次出现字符串str2的位置,如果找到匹配的字符串,返回第一次匹配的指针,否则返回NULL。#include<iostream>usingnamespacestd;char*mystrstr(char*str1,char*str2){ char*p,*q;…

    2022年6月25日
    28
  • WiFi网络WPA2 KRACK漏洞分析报告「建议收藏」

    WiFi网络WPA2 KRACK漏洞分析报告「建议收藏」作者:阿里安全技术平台团队————————0x00漏洞概述安全研究员MathyVanhoef发现的WPA2协议的KRA(KeyReinstallationAttacks)漏洞,利用WPA2协议标准加密密钥生成机制上的设计缺陷,四次握手协商加密密钥过程中第三个消息报文可被篡改重放,导致在用密钥被重新安装。WiFi网络通过WPA…

    2022年6月10日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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