IOC和DI之刨根问底之第一节
很多freshman上来就想搞清楚什么是IOC和DI,其实很多先进的理论和技术都在老的基础上升华出来的,最终目的是为了解放生产力。
所以先来说说下面两点基础知识:
- Direct Dependency(直接依赖)
- Inverted Dependency(反向依赖)
Direct Dependency
应用程序中的依赖关系方向应该是抽象的方向,而不是实现详细信息的方向。 大部分应用程序都是这样编写的:编译时依赖关系顺着运行时执行的方向流动,从而生成一个直接依赖项关系图。 也就是说,如果类 A 调用类 B 的方法,类 B 调用 C 类的方法,则在编译时,类 A 将取决于类 B,而 B 类又取决于类 C,如图1所示。
假设一个A通过朋友B和C找超级富婆的故事,A只有B朋友的关系,B只有C朋友的关系,C朋友才能帮忙找到超级富婆!条件是“身体好”!
对应的代码块如下:
public class ClassA
{
/// <summary>
/// Find super rich woman
/// </summary>
/// <returns>return super rich woman</returns>
public string FindRichWoman()
{
var criteria = "身体好";
return new ClassB().FindRichWoman(citeria);
}
}
public class ClassB
{
/// <summary>
/// Find super rich woman by citeria.
/// </summary>
/// <returns>return super rich woman</returns>
public string FindRichWoman(string criteria)
{return new ClassC().FindRichWoman(criteria);
}
}
public class ClassC
{
/// <summary>
/// Find super rich woman by criteria.
/// </summary>
/// <returns>return super rich woman</returns>
public string FindRichWoman(string criteria)
{
if (criteria.Equals("身体好"))
return "Super Rich Woman"; return string.Empty;
}
}
编译时和运行时的依赖关系和控制关系都是A=》B=》C
- 高层次类对底层次类正向依赖 - A要想找到富婆就必须要找到B,B需要去找C
- 高层次类对低层次类的正向控制 - B什么时候要富婆由A来决定,C什么时候去找富婆由B来决定
Inverted Dependency
应用依赖关系反转原则后,A 可以调用 B 实现的抽象上的方法,让 A 可以在运行时调用 B,而 B 又在编译时依赖于 A 控制的接口(因此,典型的编译时依赖项发生反转)。 运行时,程序执行的流程保持不变,但接口引入意味着可以轻松插入这些接口的不同实现。
- 依赖关系反转原则之抽象接口和工厂模式应用 - 上面那段话可以这么理解,A发现找个富婆还要自己亲自去找B,还得管B的吃喝拉撒,所以是否可以找机器人中心(工厂模式)帮忙搭线,自己只要找到由B抽象出来的虚拟机器人就可以了
使用工厂模式后,只需要将抽象接口B给到工厂就能找到想要的方法,A不用去关注对象B是怎么产生的。
public class ClassA
{
/// <summary>
/// Find super rich woman
/// </summary>
/// <returns>return super rich woman</returns>
public string FindRichWoman()
{
var criteria = "身体好";
return factory.CreateInstance(InterfaceB).FindRichWomanByB(criteria);
}
}
- 接口引入意味着可以轻松插入这些接口的不同实现 如果A突然不想通过B找富婆,假设D也可以现实找到富婆,那么只需要将接口D扔给工厂,条件还是只要身体好,他就能给你找到富婆!
public class ClassD: InterfaceD
{
/// <summary>
/// Find super rich woman by criteria.
/// </summary>
/// <returns>return super rich woman</returns>
public string FindRichWomanByAnotheWay(string criteria)
{
if (criteria.Equals("身体好"))
return "Super Rich Woman"; return string.Empty;
}
}
}
public class ClassA
{
/// <summary>
/// Find super rich woman
/// </summary>
/// <returns>return super rich woman</returns>
public string FindRichWoman()
{
var criteria = "身体好";
return factory.CreateInstance(InterfaceD).FindRichWomanByAnotheWay(criteria);
}
}
发现很多博主在讲解IOC时,就将此处的概念就定义为IOC, 其实此处:
- 高层次的类不再正向依赖于低层次的类,两者都依赖于抽象接口 - 类A依赖了InterfaceA和InterfaceD
- 低层次类依赖于高层次类的需求抽象 类A有通过B和通过C来富婆的两种需求,这种需求抽象出来就是通过谁来富婆,那么低层次的类B和类D都依赖于这个来自高层次类抽象出来的需求
最大的优势就是解耦了高层次模块对于低层次模块的紧密依赖,可以灵活扩展!
到了锻炼身体的时间了,下一节再来说IOC和DI的概念和对应的场景
IOC和DI之刨根问底之第一节的更多相关文章
- Spring MVC -- Spring框架入门(IoC和DI)
Spring MVC是Spring框架中用于Web应用开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图像化用户交互开发中的设计模式, ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- Spring控制反转与依赖注入(IOC、DI)
IOC: 反转控制 Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...
- Spring框架中的IOC和DI的区别
上次面试被问到IOC和DI的区别时,没怎么在意,昨天又被问到,感觉有点可惜.今晚总算抽点时间,查看了spring官方文档.发现,IoC更像是一种思想,DI是一种行为.为了降低程序的耦合度,利用spri ...
- spring的IOC,DI及案例详解
一:spring的基本特征 Spring是一个非常活跃的开源框架:它是一个基于Core来架构多层JavaEE系统的框架,它的主要目的是简化企业开发.Spring以一种非侵入式的方式来管理你的代码,Sp ...
- IOC and DI
Spring.Net 技术简介 IOC and DI 一 简单介绍 IOC 控制转移,就是将创建放到容器里,从而达到接耦合的目的,DI是 在容器创建对象的时候,DI读取配置文 ...
- Spring详解(四)------注解配置IOC、DI
Annotation(注解)是JDK1.5及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的. 前面讲解 IOC 和 DI 都是通过 ...
- Spring 简单使用IoC与DI——XML配置
目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...
随机推荐
- Android使用Fragment+ViewPager +TabLayout实现顶部标题栏
参考资料: https://blog.csdn.net/Tobey_r1/article/details/93221486 项目背景是Android开发新闻APP,实现新闻文本的分类,内容的展示,并实 ...
- Java基础系列(12)- 运算符
运算符 算数运算符:+ - * / % ++ -- 赋值运算符:= += -= *= /= 关系运算符:> < >= <= == != instanceof 逻辑运算符:&am ...
- 华为云计算IE面试笔记-FusionSphere Openstack有哪些关键组件,各组件主要功能是什么?三种存储接入组件的差异有哪些?
1. Nova:在OpenStack环境中提供计算服务,负责计算实例(VM,云主机)生命周期的管理,包括生成.调度和回收.Nova不负责计算实例的告警上报(FC管). 2. Cinder:为计算实例提 ...
- SonarQube汉化
SonarQube安装后默认是英文,如果不习惯看英文,可以进行汉化,官方提供了汉化插件. 登录后,汉化步骤如下: 需要点击了解风险,不然查询到插件后没有install按钮 搜索Chinese,找到插件 ...
- 学习laravel总结中...
1,安装homestead :mac环境 https://learnku.com/docs/laravel-development-environment/5.5/development-enviro ...
- english note(6.3 to 6.8)
6.3 http://www.51voa.com/VOA_Special_English/pakistan-town-struggles-with-rise-in-hiv-infections-821 ...
- MyBatis-Plus代码生成器的使用
1.MyBatis-Plus简介 在代码开发中,肯定会遇到代码中对应数据库表去编写实体类的工作,若数据库表数量多的情况下,编写Entity,属实是一件消耗时间,且并没有什么技术含量的事情,如何解决 ...
- 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 百篇博客分析OpenHarmony源码 | v65.01
百篇博客系列篇.本篇为: v65.xx 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02
百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...
- bzoj4025-二分图【线段树分治,并查集】
正题 题目链接:https://darkbzoj.tk/problem/4025 题目大意 \(n\)个点\(m\)条边,每条边会在一个\(T\)以内的时间段内出现,对于任意一个\(T\)以内的时刻求 ...