博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式]唠唠依赖注入
阅读量:6295 次
发布时间:2019-06-22

本文共 2800 字,大约阅读时间需要 9 分钟。

啥是依赖注入(Dependency injection)?

直接上例子:

  • 这不是依赖注入!

//这不是依赖注入!!!class Bar{}class Foo{    protected $bar;    public function __construct()    {        $this->bar = new Bar();    }    public function getBar()    {        return $this->bar;    }}$foo = new Foo();
  • 这就是依赖注入

//这就是依赖注入。。。class Bar{}class Foo{    protected $bar;    public function __construct(Bar $bar)    {        $this->bar = $bar;    }    public function getBar()    {        return $this->bar;    }}$bar = new Bar();$foo = new Foo($bar);
  • 这也是依赖注入

//这也是依赖注入。。。class Bar{}class Foo{    protected $bar;    public function __construct()    {    }        public function setBar(Bar $bar)    {        $this->bar = $bar;    }    public function getBar()    {        return $this->bar;    }}$bar = new Bar();$foo = new Foo();$foo->setBar($bar);

依赖注入就是new好了依赖的对象注入进去,而不是在类中显式的new一个依赖的对象。其实,就是这么简单。。。

为啥要用依赖注入?

虽然思想简单,但是在降低耦合度方面作用巨大。

依赖注入都可以怎么用

下面举个例子说明(just for demonstration):

比如我们做了个小游戏,里面的男人可以亲自己的妻子。

abstract class Human{}class Woman extends Human{}class Man extends Human{    protected $wife;    public function __construct()    {        $this->wife = new Woman();    }    public function kissWife()    {        echo "the man kissed his wife";    }}$man = new Man();$man->kissWife();

玩的人越来也多,新需求随之而来。。。

产品经理(腐腐):妻子改成可以是男的吧,好多用户有这个需求,这样玩我们游戏的肯定更多。

程序员(猿猿)心里:擦,Wife又可以是Man,又可以是Woman,这可咋整。

这个时候,依赖注入就可以闪亮登场了。

abstract class Human{}class Woman extends Human{}class Man extends Human{    protected $wife;    public function setWife(Human $human)    {        $this->wife = $human;    }    public function kissWife()    {        echo "the man kissed his wife";    }}$man = new Man();$man->setWife(new Woman());$man->kissWife();$anotherMan = new Man();$anotherMan->setWife(new Man());$anotherMan->kissWife();

这里我们看到,依赖注入的可以是继承依赖类的任何类,所以现在Man的Wife既可以是Woman也可以是Man。

玩的人越来也多,新需求随之而来。。。

产品经理(宅宅):把妻子改成伴侣吧,伴侣里面除了Man和Woman再加个Cat,好多用户有这个需求,这样玩我们游戏的肯定更多。

程序员(猿猿)心里:擦,又是Man又是Woman还有Cat,幸好我会依赖注入。

abstract class Human{}interface canBePartner{}class Cat implements canBePartner{}class Woman extends Human implements canBePartner{}class Man extends Human implements canBePartner{    protected $partner;    public function setPartner(canBePartner $partner)    {        $this->partner = $partner;    }    public function kissPartner()    {        echo "the man kissed his partner";    }}$man = new Man();$man->setPartner(new Woman());$man->kissPartner();$man2 = new Man();$man2->setPartner(new Man());$man2->kissPartner();$man3 = new Man();$man3->setPartner(new Cat());$man3->kissPartner();

这里我们看到,依赖注入不但可以是继承依赖类的所有子类,也可以是实现依赖接口的所有类。

所以如果我们在伴侣中再加入一个Dog,只需要让它实现canBePartner接口就可以了:

class Dog implements canBePartner{}$man = new Man();$man->setPartner(new Dog());

实际应用

依赖注入虽然降低了耦合度,但是也有缺点,就是需要我们自己管理注入的对象。

所以,在实际应用中,我们通常需要实现一个容器去管理和实现依赖对象的注入。
实际上,PHP的常用Web框架中都是这么做的。

博客地址:

转载地址:http://hxvta.baihongyu.com/

你可能感兴趣的文章
Spring Boot 最佳实践(三)模板引擎FreeMarker集成
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
Google MapReduce到底解决什么问题?
查看>>
CCNP-6 OSPF试验2(BSCI)
查看>>
Excel 2013 全新的图表体验
查看>>
openstack 制作大于2TB根分区自动扩容的CENTOS镜像
查看>>
Unbuntu安装遭遇 vmware上的Easy install模式
查看>>
几个常用的ASP木马
查看>>
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>
Redhat as5安装Mysql5.0.28
查看>>
通过TMG发布ActiveSync
查看>>
Web服务器的配置与管理(4) 配置访问权限和安全
查看>>
sql注入之order by猜列数问题
查看>>