zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Cannot resolve com.born:xxx_dao:unknown
    The valid characters are defined in RFC 7230 and RFC 3986错误
    web项目资源路径找不到 | Failed to load resource: the server responded with a status of 404 () | Uncaught ReferenceError: $ is not defined
    IDEA中Tomcat的控制台乱码
    PUThttp://localhost.......jpg returned a response status of 409
    IDEA 1099端口被占用
    无法添加注解------IDEA下Maven工程中改变默认JDK版本1.5为1.8的问题
    An invalid character [32] was present in the Cookie value
    HTTP Status 405 HTTP method GET is not supported by this URL
    IDEA Tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost].
  • 原文地址:https://www.cnblogs.com/yszr/p/10680510.html
Copyright © 2011-2022 走看看