如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?

第一章:小明和他的手机

从前有个人叫小明

小明有三大爱好,抽烟,喝酒…… 咳咳,不好意思,走错片场了。应该是逛知乎、玩王者农药和抢微信红包

小明的三大爱好

我们用一段简单的伪代码,来制造一个这样的小明

 

class Ming extends Person
{private $_name;private $_age;function read(){//逛知乎}function  play(){//玩农药}function  grab(){//抢红包}}

 

但是,小明作为一个人类,没有办法仅靠自己就能实现以上的功能,他必须依赖一部手机,所以他买了一台iphone6,接下来我们来制造一个iphone6

 

class iPhone6 extends Iphone
{function read($user="某人"){echo $user."打开了知乎然后编了一个故事 \n";}function play($user="某人"){echo $user."打开了王者农药并送起了人头 \n";}function grab($user="某人"){echo $user."开始抢红包却只抢不发 \n";}
}

 

小明非常珍惜自己的新手机,每天把它牢牢控制在手心里,所以小明变成了这个样子

 

class Ming extends Person
{private $_name;private $_age;public function  __construct(){$this->_name = '小明';$this->_age = 26;}function read(){//……  省略若干代码(new iPhone6())->read($this->_name); //逛知乎}function  play(){//……  省略若干代码(new iPhone6())->play($this->_name);//玩农药}function  grab(){//……  省略若干代码(new iPhone6())->grab($this->_name);//抢红包}}

 

今天是周六,小明不用上班,于是他起床,并依次逛起了知乎,玩王者农药,并抢了个红包。

$ming = new Ming();  //小明起床
$ming->read();
$ming->play();
$ming->grab();

这个时候,我们可以在命令行里看到输出如下

小明打开了知乎然后编了一个故事 
小明打开了王者农药并送起了人头 
小明开始抢红包却只抢不发

这一天,小明过得很充实,他觉得自己是世界上最幸福的人。

 

第二章: 小明的快乐与忧伤

 

小明和他的手机曾一起度过了一段美好的时光,一到空闲时刻,他就抱着手机,逛知乎,刷微博,玩游戏,他觉得自己根本不需要女朋友,只要有手机在身边,就满足了。

可谁能想到,一次次地系统更新彻底打碎了他的梦想,他的手机变得越来越卡顿,电池的使用寿命也越来越短,一直到某一天的寒风中,他的手机终于耐不住寒冷,头也不回地关了机。

小明很忧伤,他意识到,自己要换手机了。

为了能获得更好的使用体验,小明一咬牙,剁手了一台iphoneX,这部手机铃声很大,电量很足,还能双卡双待,小明很喜欢,但是他遇到一个问题,就是他之前过度依赖了原来那一部iPhone6,他们之间已经深深耦合在一起了,如果要换手机,他就要拿起刀来改造自己,把自己体内所有方法中的iphone6 都换成 iphoneX。

 

漫长的改造过程

经历了漫长的改造过程,小明终于把代码中的 iphone6 全部换成了 iphoneX。虽然很辛苦,但是小明觉得他是快乐的。

于是小明开开心心地带着手机去上班了,并在回来的路上被小偷偷走了。为了应急,小明只好重新使用那部刚刚被遗弃的iphone6,但是一想到那漫长的改造过程,小明的心里就说不出的委屈,他觉得自己过于依赖手机了,为什么每次手机出什么问题他都要去改造他自己,这不仅仅是过度耦合,简直是本末倒置,他向天空大喊,我不要再控制我的手机了。

天空中的造物主,也就是作为程序员的我,听到了他的呐喊,我告诉他,你不用再控制你的手机了,交给我来管理,把控制权交给我。这就叫做控制反转

 

第三章:造物主的智慧

 

小明听到了我的话,他既高兴,又有一点害怕,他跪下来磕了几个头,虔诚地说到:“原来您就是传说中的造物主,巴格梅克上神。我听到您刚刚说了 控制反转 四个字,就是把手机的控制权从我的手里交给你,但这只是您的想法,是一种思想罢了,要用什么办法才能实现控制反转,又可以让我继续使用手机呢?”

“呵“,身为造物主的我在表现完不屑以后,扔下了四个大字,“依赖注入!”

 

接下来,伟大的我开始对小明进行惨无人道的改造,如下

 

class Ming extends Person
{private $_name;private $_age;private $_phone; //将手机作为自己的成员变量public function  __construct($phone){$this->_name = '小明';$this->_age = 26;$this->_phone = $phone;echo "小明起床了 \n";}function read(){//……  省略若干代码$this->_phone->read($this->_name); //逛知乎}function  play(){//……  省略若干代码$this->_phone->play($this->_name);//玩农药}function  grab(){//……  省略若干代码$this->_phone->grab($this->_name);//抢红包}}

接下来,我们来模拟运行小明的一天

$phone = new IphoneX(); //创建一个iphoneX的实例
if($phone->isBroken()){//如果iphone不可用,则使用旧版手机$phone = new Iphone6();
}
$ming = new Ming($phone);//小明不用关心是什么手机,他只要玩就行了。
$ming->read();
$ming->play();
$ming->grab();

我们先看一下iphoneX 是否可以使用,如果不可以使用,则直接换成iphone6,然后唤醒小明,并把手机塞到他的手里,换句话说,把他所依赖的手机直接注入到他的身上,他不需要关心自己拿的是什么手机,他只要直接使用就可以了。

这就是依赖注入

 

第四章:小明的感悟

 

小明的生活开始变得简单了起来,而他把省出来的时间都用来写笔记了,他在笔记本上这样写到

 

我曾经有很强的控制欲,过度依赖于我的手机,导致我和手机之间耦合程度太高,只要手机出现一点点问题,我都要改造我自己,这实在是既浪费时间又容易出问题。自从我把控制权交给了造物主,他每天在唤醒我以前,就已经替我选好了手机,我只要按照平时一样玩手机就可以了,根本不用关心是什么手机。即便手机出了问题,也可以由造物主直接搞定,不需要再改造我自己了,我现在买了七部手机,都交给了造物主,每天换一部,美滋滋!
我也从其中获得了这样的感悟: 如果一个类A 的功能实现需要借助于类B,那么就称类B是类A的依赖,如果在类A的内部去实例化类B,那么两者之间会出现较高的耦合,一旦类B出现了问题,类A也需要进行改造,如果这样的情况较多,每个类之间都有很多依赖,那么就会出现牵一发而动全身的情况,程序会极难维护,并且很容易出现问题。要解决这个问题,就要把A类对B类的控制权抽离出来,交给一个第三方去做,把控制权反转给第三方,就称作控制反转(IOC Inversion Of Control)控制反转是一种思想,是能够解决问题的一种可能的结果,而依赖注入(Dependency Injection)就是其最典型的实现方法。由第三方(我们称作IOC容器)来控制依赖,把他通过构造函数、属性或者工厂模式等方法,注入到类A内,这样就极大程度的对类A和类B进行了解耦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

closewait一直不释放_夏至太阳庆典 || 巨蟹座日蚀新月大释放蜡烛魔法仪式(寻找新的幸运儿)...

太阳庆典. 2020夏至 太阳庆典蜡烛魔法仪式夏至(MIDSUMMER)是四个至点之一,站在春分与秋分之间,并且成为光明力量的象征,因为在这一天白昼的时间是最长的,也代表阳性力量会在这一天达到顶端。许多古老文化会利用火元素来象征这一…

Postman status: 415_415亩!白云首宗农村土地规模化流转成功签约

6月3日钟落潭镇竹二村土地经营权流转签约仪式在白云产权中心顺利举行这是白云区首宗由政府主导的规模化土地流转↓↓↓<< 点击上方&#xff0c;观看完整视频 >>签约现场当天下午&#xff0c;竹二村经济联合社、广州市云供农业科技有限公司和广东三青农业科技有限公…

昆仑通态复制的程序可以用吗_一个PLC连接两个触摸屏例子,昆仑通态和普洛菲斯举例...

以昆仑通态触摸屏和普洛菲斯触摸屏说事啊。昆仑通态TCP7062普洛菲斯GP4402W在自动化设备中&#xff0c;如果设备跨度比较大的话&#xff0c;只有一个屏幕会让使用者不易看数据&#xff0c;要跑来跑去或者操作看不到动作点诸多问题&#xff0c;我做的项目中就有一个电柜只有一个…

Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案

1.ZTest & ZWrite ZTest&#xff1a;深度测试&#xff0c;开启后测试结果决定片元是否被舍弃&#xff0c;可配置 ZWrite&#xff1a;深度写入&#xff0c;开启后决定片元的深度值是否写入深度缓冲&#xff0c;可配置 ZTest可设置的测试规则&#xff1a; ZTest Less&…

LeetCode 235. 二叉搜索树的最近公共祖先

题解 官方的题解就很清晰 https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/solution/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian--2/ 方法一&#xff1a;递归 public class Solution {public TreeNode LowestCommonAncestor(TreeN…

判断鼠标是否在元素上_能不能从大便上判断出一个人是否患有结肠癌?

通过大便的观察是可以怀疑是否得了结肠癌的&#xff0c;但并不是由于从大便上诊断患者得了癌症这个病。结肠癌症诊断金标准结肠癌的诊断的金标准做肠镜&#xff0c;通过肠镜进行观察&#xff0c;看是否有癌症。如果不明显&#xff0c;通过肉眼无法判断&#xff0c;一般要通过病…

LeetCode 240. 搜索二维矩阵

因为矩阵的行和列是排序的&#xff08;分别从左到右和从上到下&#xff09;&#xff0c;所以在查看任何特定值时&#xff0c;我们可以修剪O(m)O(m)或O(n)O(n)元素。 算法&#xff1a; 首先&#xff0c;我们初始化一个指向矩阵左下角的 (row&#xff0c;col)(row&#xff0c;co…

win10兼容模式怎么设置_win10护眼模式关不掉怎么办

win10系统是一款非常值得使用的优秀系统!强大的智能是win10系统最让人喜欢的地方&#xff0c;各种各样贴心的设置可以让用户们在使用电脑的过程中得到最好舒适体验&#xff0c;但是一些小伙伴们并不知道怎么才能设置好想要的设置&#xff0c;今天小编为大家带来的就是win10关闭…

Unity 2017 Game Optimization 读书笔记 Scripting Strategies Part 5

一. Disable unused scripts and objects 场景中激活的物体或者脚本越多&#xff0c;开销越大。对于很多并没有产生作用的脚本和物体&#xff0c;可以隐藏掉从而提升性能&#xff0c;比如FPS游戏中视野外的部分。 1.Disabling objects by visibility 有时我们希望脚本和物体…

代码实现sql编译器_TiDB-Wasm 原理与实现 | Hackathon 优秀项目介绍

作者&#xff1a;Ti-Cool上周我们推送了《让数据库运行在浏览器里&#xff1f;TiDB WebAssembly 告诉你答案》&#xff0c;向大家展示了 TiDB-Wasm 的魅力&#xff1a;TiDB-Wasm 项目是 TiDB Hackathon 2019 中诞生的二等奖项目&#xff0c;实现了将 TiDB 编译成 Wasm 运行在浏…

C# int[,] 和 int[][]

原文链接&#xff1a;https://www.cnblogs.com/ILoveMyJob/p/9211102.html

java停车收费系统 源码开源_Java开源商城源码推荐,从菜鸡到大神,永远绕不开的商城系统

每个Java程序员&#xff0c;从懵逼菜鸡&#xff0c;再到懵懂菜鸟&#xff0c;再到小鸟&#xff0c;大鸟&#xff0c;最后到技术大神&#xff0c;始终绕不开商城系统&#xff0c;里面蕴含了大量的业务&#xff0c;涉及到了大量的知识点和解决方案。今天介绍一款Java开源商城源码…

安卓ps2模拟器_安卓PSP模拟器评测:合金装备 和平步行者

哈喽&#xff0c;大家好&#xff0c;好久没有玩PSP模拟器了&#xff0c;昨晚下载了一款PSP游戏的3A大作&#xff0c;这款游戏名字叫做《合金装备 和平步行者》&#xff0c;这款游戏发售时间是&#xff1a;2010年4月29日。本作是真真正正由小岛秀夫亲自主刀开发的系统正统作品&a…

UnityEngine.UI.dll 路径

2019.2之后&#xff0c;路径已经从 Unity安装目录下的Editor\Data\UnityExtensions移动到了 package里&#xff0c;通过package编译后生成的dll在工程目录下的library里

c++ 异步下获取线程执行结果_这份阿里技术官强推的java线程池笔记,建议你看一下

线程池线程是宝贵的内存资源,单个线程占1MB空间,过多分配易造成内存溢出频繁的创建及销毁线程会增加虚拟机回收频率、资源开销、造成程序性能下降因此线程池出现了线程池的概念线程容器,可设定线程分配的数量上限将预先创建的线程对象存入池中,并重用线程池中的线程对象避免频繁…

此应用无法在你的电脑上运行_能直运行iOS应用!苹果新macOS翻车 正式版下载后无法安装...

原标题&#xff1a;能直运行iOS应用&#xff01;苹果新macOS翻车 正式版下载后无法安装 今天&#xff0c;苹果正式推出了macOS Big Sur正式版&#xff0c;其是苹果为Mac电脑设计的下一代操作系统&#xff0c;最大的变化是在性能上&#xff0c;因为Big Sur是第一个以苹果自研处理…

springcloud 整合 gateway_从Spring Cloud到Kubernetes的微服务迁移实践

写在前面要出发周边游&#xff08;以下简称要出发&#xff09;是国内知名的主打「周边游」的在线旅行网站&#xff0c;为了降低公司内部各个业务模块的耦合度&#xff0c;提高开发、交付及运维效率&#xff0c;我们在 2017 年就基于 Spring Cloud 完成了公司内部业务微服务化的…

leetcode 191. 位1的个数

经典题目&#xff0c;位操作的小技巧&#xff1a;与操作 我们可以把前面的算法进行优化。我们不再检查数字的每一个位&#xff0c;而是不断把数字最后一个 1 反转&#xff0c;并把答案加一。当数字变成 00 的时候偶&#xff0c;我们就知道它没有 1 的位了&#xff0c;此时返回…

程序员如何跟领导提离职_如何优雅地跟老板提加薪?按照这3个步骤来,也不是什么难事...

通常情况下&#xff0c;如果你在一个制度比较健全的单位上班&#xff0c;基本上不需要自己提出加薪的要求&#xff0c;达到规定的条件自然就涨工资了。但是我们绝大部分人&#xff0c;是在中小企业上班&#xff0c;如果不跟老板提加薪要求&#xff0c;老板很难主动给你涨工资。…