摘要:引述最近看设计模式以及代码,对于控制反转以及依赖注入这些概念非常困惑,于是找了一些资料,以下是对于控制反转的一下理解。其中最常见的方式叫做依赖注入,简称,还有一种方式叫依赖查找。在软件工程中,依赖注入是种实现控制反转用于解决依赖性设计模式。
引述
最近看设计模式以及laravel代码,对于控制反转以及依赖注入这些概念非常困惑,于是找了一些资料,以下是对于控制反转的一下理解。
概念 IoC控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
正如概念中描述的,那么控制反转具体指哪些 控制 被 反转 了呢,其实我理解的控制反转是指程序所控制的对象的控制权交给了容器,而这个容器就是实现各个模块解耦合的关键。IoC只是一种设计思想,主要实现有:
依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。
依赖注入(Dependency Injection)
我们着重说一下依赖注入。
DI在软件工程中,依赖注入是种实现控制反转用于解决依赖性设计模式。一个依赖关系指的是可被利用的一种对象(即服务提供端) 。依赖注入是将所依赖的传递给将使用的从属对象(即客户端)。该服务是将会变成客户端的状态的一部分。 传递服务给客户端,而非允许客户端来建立或寻找服务,是本设计模式的基本要求。
以上是wikipedia上对于依赖注入的理解,下面将用实际的例子详细讲解。
举例加入我们设计一个通用的用户登录基类,可以支持多个平台的用户登录
那么最糟糕的写法是,
/** * A类用户登录 **/ class User_A_Login { public function checkALogin(){ }; } /** * B类用户登录 **/ class User_B_Login { public function checkBLogin(){ }; } /** * 登录基类 **/ class User_Login { public function checkLogin($userType) { if($userType = "A"){ $this->objAUser = new User_A_Login(); $this->objAUser->checkALogin(); }elseif($userType = "B"){ $this->objBUser = new User_B_Login(); $this->objBUser->checkBLogin(); } } }
上面的 User_Login 这个类就直接依赖于类 User_A_Login 和 User_B_Login ,如果我们使用下面这种方式写
interface User_Login_Interface { public function checkLogin(); } /** * A类用户登录 **/ class User_A_Login implements User_Login_Interface { public function checkLogin(){ }; } /** * B类用户登录 **/ class User_B_Login implements User_Login_Interface { public function checkLogin(){ }; } /** * 登录基类 **/ class User_Login { public $userLogin; public function setUser(User_Login_Interface $user){ $this->userLogin = $user; } public function checkLogin() { $this->userLogin->checkLogin(); } }
如果按照这种方式进行构建代码,我们将依赖项User_B_Login或者User_A_Login通过函数 setUser( ) 注入到类中,调用方式:
$userLogin = new User_Login(); $userLogin->setUser(new User_A_Login); $userLogin->checkLogin();
调用方可以控制使用那个登录类型,这就完成了对于不同登录系统的依赖注入。如果你引入了一个新的用户c,只需写一个c的登录类:
/** * C类用户登录 **/ class User_C_Login implements User_Login_Interface { public function checkLogin(){ }; }
就可以通过:
$userLogin = new User_Login(); $userLogin->setUser(new User_C_Login); $userLogin->checkLogin();
进行登录验证了。在实际代码中由于基类非常复杂需要对登录做一系列处理,所以每次添加登录用户不应该去修改基类。对于一下框架例如laravel的框架是不能修改的,应该就是通过这种方式实现的调用方的自定义。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28774.html
摘要:本文一大半内容都是通过举例来让读者去理解什么是控制反转和依赖注入,通过理解这些概念,来更加深入。这种由外部负责其依赖需求的行为,我们可以称其为控制反转。工厂模式,依赖转移当然,实现控制反转的方法有几种。 容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样一种容器,它存放的不是文本、数值,而是对象、对象的描...
摘要:对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。控制被反转之后,获得依赖对象的过程由自身管理变为了由容器主动注入。于是,他给控制反转取了一个更合适的名字叫做依赖注入。 Spring还可以这么学--IoC(控制反转) / DI(依赖注入)理解 声明:文章的前三部分参考博文:https://www.cnblogs.com/Nouno...这篇文章首发是在我的个人微信订阅号每天学编...
摘要:划下重点,服务容器是用于管理类的依赖和执行依赖注入的工具。类的实例化及其依赖的注入,完全由服务容器自动的去完成。 本文首发于 深入剖析 Laravel 服务容器,转载请注明出处。喜欢的朋友不要吝啬你们的赞同,谢谢。 之前在 深度挖掘 Laravel 生命周期 一文中,我们有去探究 Laravel 究竟是如何接收 HTTP 请求,又是如何生成响应并最终呈现给用户的工作原理。 本章将带领大...
摘要:学习总结学习整理的一些笔记,很简单。大部分认为和只是不同的叫法而已。依赖注入的两种方式和注解使用注释驱动的功能源码剖析 Spring IoC学习总结 学习spring Ioc整理的一些笔记,很简单。分享给大家。 IoC 基本概念 在这之前,我们先记住一句话。好莱坞原则:Dont call us, we will call you.其实这句话很恰当地形容了反转的意味;Ioc, Inve...
阅读 702·2021-11-11 16:54
阅读 3030·2021-09-26 09:55
阅读 1947·2021-09-07 10:20
阅读 1170·2019-08-30 10:58
阅读 1009·2019-08-28 18:04
阅读 678·2019-08-26 13:57
阅读 3541·2019-08-26 13:45
阅读 1121·2019-08-26 11:42