【转】10分钟快速理解依赖注入

最近有人问我“依赖注入”怎么理解,说实话,当初接触依赖注入的时候我也很迷茫,前些天看到一篇博文讲得不错,便借鉴了过来作为参考吧。

业务场景

小明要去旅游,但是还未确定以什么方式出游,有可能是徒步旅行,也有可能是自驾游。

代码演示

根据步行和驾车的速度来考虑距离旅游目的地的路程,所以这里定义了两个属性\(speed**和**\)distance。所以有了如下代码:

	interface TravelInterface
	{
		public function __construct($speed, $distance);
		public function run();
	}
	
	abstract class Travel implements TravelInterface
	{
		protected $speed; // 最高时速
		protected $distance; // 最远路程
		
		public function __construct($speed, $distance)
		{
			$this->speed = $speed;
			$this->distance = $distance;
		}
	}
	
	class Drive extends Travel
	{
		public function run()
		{
			echo "自驾游";
		}
	}
	
	class Walk extends Travel
	{
		public function run()
		{
			echo "徒步旅行";
		}
	}

下面是选择自驾游的代码

	class Human
	{
		protected $travel; // 出行方式
		
		public function __construct()
		{
			$this->travel = new Drive(60,1000);
		}
		
		public function traveling()
		{
			$this->travel->run();
		}
	}
	
	$xiaoming = new Human();
	$xiaoming->traveling();

那么,如果需要换一种出行方式的时候,则需要修改Human类。这里看起来修改非常简单,但是我们实际项目中可能会夹杂着很多的业务逻辑一起修改。
就说下依赖注入的基础方式

	class Human
	 {
	 	protected $travel; // 出行方式
	 	
	 	public function __construct(travel $travel)
	 	{
	 		$this->travel = $travel;
	 	}
	 	
	 	public function traveling()
	 	{
	 		$this->travel->run();
	 	}
	 }
	 
	 $travel = new drive(60,1000);
	 $xiaoming = new human($travel);
	 $xiaoming->traveling();

什么是依赖注入?

简单的说:在A类中使用了B类的实例时,B对象的构造不是在A类某个方法中初始化的,而是在A类外部初始化之后以B类的对象传入进来。这个过程就是依赖注入。

换一种通过配置文件来实现控制反转

	$config = [
		"Travel" => drive::class,
	];
	
	$travel = new $config["Travel"](60,1000);
	$xiaoming = new Human($travel);
	$xiaoming->traveling();

通过上面的方式,以什么方式旅行,只需要修改配置$config就行。

这在我们PHP里感触不明显,觉得修改\(config**和修改* **\)travel = new drive(60,1000) *差别不大,一方面是便于管理,另一方面是PHP的非编译型的特性优势。如果用Java来实现,感触就非常明显了,比如程序已经打包了,只需要修改配置文件,就可以控制类的依赖关系了。起到了解耦的作用。

虽然很多时候大家一说到 ** 控制反转 依赖注入 **,就非要和说到反射,我觉得上面IOC只是一种思想,具体的实现方式,在不同的语言中有不同的表现形式。

只要将这种依赖关系解耦出来,可以配置化。

就是IOC的实现了。

【原文来自:https://mengkang.net/790.html

posted @ 2017-08-12 20:40  凭栏知潇雨  阅读(194)  评论(0编辑  收藏  举报