10分钟理解依赖注入
看到网络上很多“依赖注入”解释的话题,这篇博客呢也只是我自己的观点,如果你有不同的观点请拍砖,不用客气。
业务场景
小明要去旅游,但是还未确定以什么方式出游,有可能是徒步旅行,也有可能是自驾游。
代码演示
根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性$speed
和$distance
。所有有了如下代码:
interface travelInterface{public function __construct($speed, $distance);public function run();
}abstract class travel implements travelInterface{protected $speed; // 最高时速protected $distance; // 最远路程public function __construct($speed, $distance){$this->speed = $speed;$this->distance = $distance;}}class drive extends travel{public function run(){echo "自驾游";}
}class walk extends travel{public function run(){echo "徒步旅行";}
}
如果是选择自驾游
class human
{protected $travel; // 出行方式public function __construct(){$this->travel = new drive(60,1000);}public function traveling(){$this->travel->run();}
}$xiaoming = new human();
$xiaoming->traveling();
那么,如果需要换一种出行方式的时候,则需要修改human
类。这里看起来修改非常简单,但是我们实际项目中可能会夹杂着很多的业务逻辑一起修改。
就说下依赖注入的基础方式
class human
{protected $travel; // 出行方式public function __construct(travel $travel){$this->travel = $travel;}public function traveling(){$this->travel->run();}
}$travel = new drive(60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();
什么是依赖注入
简单的说:在A类中使用了B类的实例时,B对象的构造不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的对象传入进来。这个过程就是依赖注入。
换一种通过配置文件来实现控制反转
$config = ["travel" => drive::class,
];$travel = new $config["travel"](60,1000);
$xiaoming = new human($travel);
$xiaoming->traveling();
通过上面的方式,以什么方式旅行,只需要修改配置$config
就行。
这在我们PHP里感触不明显,觉得修改$config
和修改$travel = new drive(60,1000)
差别不到,一方面是便于管理,另一方面是PHP的非编译型的特性优势。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只需要修改配置文件,就可以控制类的依赖关系了。起到了解耦的作用。
虽然很多时候大家一说到控制反转,依赖注入,就非要和说到反射,我觉得上面IOC只是一种思想,具体的实现方式,在不同的语言中有不同的表现形式。只要将这种依赖关系解耦出来,可以配置化就是IOC的实现了。
原文地址:https://mengkang.net/790.html
10分钟理解依赖注入相关推荐
- 深度理解依赖注入(Dependence Injection)
前面的话:提到依赖注入,大家都会想到老马那篇经典的文章.其实,本文就是相当于对那篇文章的解读.所以,如果您对原文已经有了非常深刻的理解,完全不需要再看此文:但是,如果您和笔者一样,以前曾经看过,似乎看 ...
- 理解依赖注入(IOC)
IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一起,解耦, ...
- 理解依赖注入(IOC)和学习Unity
IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一起,解耦, ...
- Go工程化 - 手摸手带你理解依赖注入
转载地址:https://mp.weixin.qq.com/s/c7JtKKCGSD5x9c4TxqzghQ 我们在微服务框架 kratos v2[1] 的默认项目模板中 kratos-layout[ ...
- ioc控制反转_深入理解依赖注入(DI)和控制反转(IOC)
转载本文务必须注明出处.微信号(Yemeir_com).以及添加原文链接. 为什么要使用依赖注入 使用依赖注入(DI)可以使控制者与抽象实现者松耦合,便于单元测试.通过控制反转(IOC)的设计原理来减 ...
- 如何理解依赖注入(DI)
什么是依赖注入(Dependency Injection) 依赖倒置原则:高层模块不应该依赖于低层模块,两个都应该依赖于抽象(接口). 依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码 ...
- 代码的演化-DI(理解依赖注入di,控制反转ioc)
控制反转(Inversion of Control IoC)在java中,Spring就是一个很好的应用.用于解除使用者和生产者的耦合. 一般的代码中.使用者即是生产者,使用者在调用它需要的对象的时候 ...
- 【CV】10分钟理解Focal loss数学原理与Pytorch代码
原文链接:https://amaarora.github.io/2020/06/29/FocalLoss.html 原文作者:Aman Arora Focal loss 是一个在目标检测领域常用的损失 ...
- pytorch gather_【CV】10分钟理解Focal loss数学原理与Pytorch代码
原文链接:https://amaarora.github.io/2020/06/29/FocalLoss.html 原文作者:Aman Arora Focal loss 是一个在目标检测领域常用的损失 ...
最新文章
- NumPy迎来重大版本更新,新增函数注释、滑动窗口视图功能,仅支持Python 3.7以上版本...
- 如果我是博客园的产品经理【下】
- 惊呼!JavaScript基本数据类型和引用数据类型详解
- 杭州某知名xxxx公司急招大量java以及大数据开发工程师
- python logging简单使用
- 客户端用mstsc不能用一台设备连接终端服务器的解决办法
- C# lambda递归
- php sns 源码,ThinkSNS v4
- 漂浮式半潜风机(二)环境荷载
- 群控云控SDK开发包(快速开发群控云控微信SCRM客服系统)
- Git 撤销放弃本地修改
- Windows10系统输入法热键设置
- KMIP协议/TTLV格式解码
- 在windows环境下搭建mac os
- Web性能压力测试工具-Webbench
- RHEL4-ASU2-i386上安装oracle9204
- CCF 1158. 骰子游戏
- 计算机硬盘越大运行速度越大吗,电脑的内存越大越好吗?如果只加大内存,电脑反而会被拖慢!...
- 题组: 简单搜索进阶搜索
- 关于NC65通过接口新增客户档案并分配出现的分配组织错误的问题及解决方法
热门文章
- zipaligin不是内部或外部命令,也不是可运行的程序
- Python通过urllib访问网页
- Git之常见的分支操作
- 图像腐蚀 java_OpenCV3 图像膨胀 dilate、腐蚀 erode、提取图像中的条形码 JAVA 实现...
- python相同程序执行结果不同_原理相同只是精简了的python代码,运行结果不同是为什么...
- 神策数据入选铅笔道 2021 真榜“企业服务未来独角兽排行榜·营销与销售 TOP20”...
- 两个等号(==)和三个等号(===)的区别
- 并查集的一般操作 ③
- 原码、补码、反码详解
- no.4 数据和C 07