什么是依赖注入(Dependency Injection)

  • 依赖倒置原则:高层模块不应该依赖于低层模块,两个都应该依赖于抽象(接口)。
  • 依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,因此维护成本较高。而依赖倒置原则的思想是,上层不应该依赖下层,应依赖接口。意为上层代码定义接口,下层代码实现该接口,从而使得下层依赖于上层接口,降低耦合度,提高系统弹性。

举个栗子:小霸王游戏机

// 如果使用单纯的面向对象来写
class XiaoBaWang
{    private $game;    public function loadGame(){        $this->game = new HunDouLuo();        $this->game->play();    }
}
class HunDouLuo{    public function play()    {        //玩游戏    }
}
$machine = new XiaoBaWang();
$machine->loadGame();class XiaoBaWang
{    private $game;    public function loadGame()    {        $this->game = new Tank();       $this->game->play();
}
}
class Tank
{    public function play()    {        //玩游戏    }
}
$reg = new XiaoBaWang();
$reg->loadGame();

使用依赖注入的写法

小霸王游戏机:插拔式卡带

interface Game
{    public function play();
}
class HunDouLuo implements Game
{    public function play()
{
// 玩魂斗罗
}
}
class Tank implements Game
{    public function play()
{
// 坦克大战
}
}
class XiaoBaWang
{    private $game;    public function __construct(Game $game)    {        $this->game = $game;    }    public function loadGame()    {        $this->game->play();    }
}
$hunDouLuo = new HunDouLuo();
$tank = new Tank();
$machine = new XiaoBaWang($hunDouLuo);
$machine->loadGame();
$machine = new XiaoBaWang($tank);
$machine->loadGame();

上例就使用了"注入"这个思想,就像注射器一样将一个类的实例注入到另一个类的实例中去,需要用什么就注入什么。当然"依赖倒置原则"也始终贯彻在里面。"注入"不仅可以通过构造函数注入,也可以通过属性注入,上面你可以可以通过一个"set"来动态为"game"这个属性赋值。

ioc容器

不过开发中会有这样的经历,一开始类比较少,慢慢的功能越来越多,人员越来越多,编写了很多类,要使用这个类必须先引入那个类,而且一定要确保顺序正确。
于是。。。。
就出现了这样的情况, “a 依赖于b, b 依赖于c, c 依赖于 d, d 依赖于e”, 要获取‘a’的实例,你必须依次引入 ‘e,d,c,b’然后依次进行实例化。维护成本上升,开发成本上升,大家都是接盘侠。

再举一个栗子:游戏平台steam/battle

如果没有游戏平台,几个好友想要联机打魔兽争霸,我们过去是怎么做的?
1.每个人首先一起下载相同版本的游戏
2.安装驱动程序
3.建立/进入 局域互联网络
4.关闭防火墙
5.建房间,进入房间,开始游戏
如果我们玩了一段时间,想换星际争霸玩,那我们需要再来一次以上步骤。
最终,我们玩游戏这个动作是依赖于前面很多步骤的,如果有一步出了错,那么久不能正常开始游戏。

Steam/battle游戏平台做了什么?

当我们在游戏平台上面要一起玩一款游戏时,我们只需要:
1.下载安装游戏平台
2.选择一款游戏使用平台一键安装
3.开始游戏
这时,如果我们要换一款游戏,只需要换个游戏平台一键安装,然后开始游戏,不需要担心和理会之前安装的游戏和开始游戏流程对新游戏有什么影响。

有了以上的思路,我们就可以建一个steam类和游戏类了...

如何理解依赖注入(DI)相关推荐

  1. ioc控制反转_深入理解依赖注入(DI)和控制反转(IOC)

    转载本文务必须注明出处.微信号(Yemeir_com).以及添加原文链接. 为什么要使用依赖注入 使用依赖注入(DI)可以使控制者与抽象实现者松耦合,便于单元测试.通过控制反转(IOC)的设计原理来减 ...

  2. 代码的演化-DI(理解依赖注入di,控制反转ioc)

    控制反转(Inversion of Control IoC)在java中,Spring就是一个很好的应用.用于解除使用者和生产者的耦合. 一般的代码中.使用者即是生产者,使用者在调用它需要的对象的时候 ...

  3. 控制反转IOC与依赖注入DI

    为什么80%的码农都做不了架构师?>>>    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最 ...

  4. PHP依赖注入(DI)和控制反转(IoC)详解

    这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...

  5. Java依赖注入 - DI设计模式示例教程

    Java依赖注入 - DI设计模式示例教程 Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护.我们可以在java中实现依赖注入,以将依赖项解析从编译时移 ...

  6. Go工程化 - 手摸手带你理解依赖注入

    转载地址:https://mp.weixin.qq.com/s/c7JtKKCGSD5x9c4TxqzghQ 我们在微服务框架 kratos v2[1] 的默认项目模板中 kratos-layout[ ...

  7. 深度理解依赖注入(Dependence Injection)

    前面的话:提到依赖注入,大家都会想到老马那篇经典的文章.其实,本文就是相当于对那篇文章的解读.所以,如果您对原文已经有了非常深刻的理解,完全不需要再看此文:但是,如果您和笔者一样,以前曾经看过,似乎看 ...

  8. 依赖注入(di)模式_Java依赖注入– DI设计模式示例教程

    依赖注入(di)模式 Java Dependency Injection design pattern allows us to remove the hard-coded dependencies ...

  9. 控制反转(IoC)与依赖注入(DI)详解

    文章目录 什么是控制反转(IoC) 控制反转(IoC)有什么作用 控制反转(IoC)是怎么分类的 依赖注入 接口注入 Setter方法注入 构造器注入 依赖查找 上下文依赖查找(Contextuali ...

最新文章

  1. ZED~Windows
  2. Apache日志配置参数说明
  3. 5G信令(就是用户身份信息)风暴——就是客户端通过公钥加密的消息(携带手机IMSI号)发给服务端,服务器需用私钥解密,这个解密比较消耗资源,如果短时间大量请求到来就会触发信令风暴...
  4. mysql 给字段添加索引_怎么给mysql表的字段添加索引和查询索引呢
  5. FFTW在VS中集成与测试详解
  6. 非安装版的PostgreSQL8.3.3的首次使用经历
  7. matlab中的uint8函数,未定义与 'uint8' 类型的输入参数相对应的函数 'fitnessty'
  8. 加上mvc:resources后controller访问404
  9. Unity3D 动态改变地形
  10. 2.1 机器中数据的存储
  11. java tcp连接硬件_SocketTool工具(模拟开发板)和基于socket的java服务器(TCP/IP协议)开发...
  12. 中国科学家dna计算机,我国首台DNA计算机问世
  13. qq空间显示手机型号android,qq发表说说怎么显示手机型号?手机QQ空间如何自定义手机型号?...
  14. 十二月,我们一起在云台山风景区赏雪
  15. android uefi 编译报错,【Android SDM660开机流程】- UEFI XBL 代码流程分析
  16. 程序猿也爱学英语,有图有真相!
  17. xray扫描器的使用 (长亭科技公司创造)
  18. 微信小程序突然多了好多动态_让微信小程序的登陆页面有云朵悬浮的动态效果...
  19. C语言位操作详解-4.2.C语言专题第二部分-朱有鹏-专题视频课程
  20. CTF/黑客之提问的智慧

热门文章

  1. SAP QM中阶执行事务代码QDB1,报错- Inspection severity 001 AQL 0.650 not in sampling schema A01-
  2. SAP PM 入门系列之19 - IP31 Maintenance Plan Costing
  3. 垂直AI初创企业 VS 横向AI初创企业:不同的产品路线选择
  4. 破解自动机器学习的黑匣子
  5. 机器学习-贝叶斯分类器
  6. 深度学习中的激活函数总结
  7. 理解五个基本概念,让你更像机器学习专家
  8. SAP HUM 没有搬到Storage Type 923的HU能用HU02拆包?
  9. SAP MM 工序委外流程初探
  10. 「机器学习」彻底搞懂CNN