以前虽然知道控制反转,但是一直对反转的概念很模糊,怎么就反转了,反转了什么,最近在搭业务架构,想用些好的设计模式,来实现更好的解耦和扩展性,无意间看到一篇文章把控制反转 IoC 说的这么好理解,顿时茅塞顿开🐶。

代码(Inversion of Control)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Bim
{
public function doSomething()
{
echo __METHOD__, '|';
}
}

class Bar
{
private $bim;

public function __construct(Bim $bim)
{
$this->bim = $bim;
}

public function doSomething()
{
$this->bim->doSomething();
echo __METHOD__, '|';
}
}

class Foo
{
private $bar;

public function __construct(Bar $bar)
{
$this->bar = $bar;
}

public function doSomething()
{
$this->bar->doSomething();
echo __METHOD__;
}
}

$foo = new Foo(new Bar(new Bim()));
$foo->doSomething();
// Bim::doSomething|Bar::doSomething|Foo::doSomething 这里重点看下

理解

首先声明一点,我也看过很多文章会把依赖注入(DI)和控制反转(IoC)一起说,因为想要实现控制反转需要依赖注入,这里只说下控制反转,对依赖注入不了解的可以自行 Google。

本身 Foo 类可以控制自身对象的行为(doSomething),但是具体行为依赖最底层的 BimdoSomething 方法,也就是说上层代码不变的情况下,通过替换底层依赖的对象,可以改变上层代码的行为,这就是所谓的 控制反转

例如:例如Foo类用到了memcached,可以在不修改Foo类代码的情况下,改用redis。

当然我理解还有一层反转,就需要提到 容器。依赖注入需要的对象由类本身转移到了容器上,而容器中保存的上层类需要依赖的对象,这些的对象都要实现需要注入对象的接口,这就对应上在改变上层代码的情况下,通过注入不同依赖对象去改变上层类的行为。[说的感觉有点啰嗦,都是大白话,剩在好理解🐶]