小例子 理解 Laravel 依赖注入中依赖的含义

请先看一下 下面的代码
<?php

interface Visit
{
    public function go();
}

class Leg implements Visit       //行走接口
{
    public function go()
    {
        // TODO: Implement go() method.
        echo "walt to Tibet!!!";
    }
}

class Car implements Visit         //汽车接口
{
    public function go()
    {
        // TODO: Implement go() method.
        echo "drive car to Tibet!!!";
    }

}

class Train implements Visit        //火车接口
{
    public function go()
    {
        // TODO: Implement go() method.
        echo "go to Tibet by train";
    }
}

class Traveller                  // 旅行者类
{
    protected $trafficTool;

    public function __construct()
    {
        $this->trafficTool =new Leg();   // 产生依赖
    }

    public function visitTibet()
    {
        $this->trafficTool->go();
    }
}

$tra = new Traveller();

$tra->visitTibet();
  • 我们要实现的功能是旅游者去西藏,但是去西藏的方式有很多,走路、开车或者火车。不同的方式需要依靠不同的交通工具

  • 在古代交通基本靠走,通讯基本靠吼。所以旅游西藏的交通工具就是我们的大腿 Leg 所以我们在代码$this->trafficTool =new Leg(); 实例化了腿

  • 于是上述的两个组件就发生了依赖,因为我们去西藏旅行需要靠大腿走去

  • 在程序中依赖我们可以理解成为一个对象实现某个功能需要其它对象相关功能的支持

  • 但是我们使用 new 实例化对象解决了依赖,但是我们同时也引入的一个新的严重问题 耦合

  • 在古代走去西藏当然没毛病,但是现在21世纪交通工具这么发达,再走去西藏就真的很皮了

  • 所以这时我们选择做火车,毕竟有青藏铁路 。但是这时候我们就头大了,要改成做火车去西藏那么我们就要重写 Traveller 类 在里面实例化 Train 接口

  • 这代码也不知道是当初那个铁头娃写的,反正现在让我们的头很大

  • 而一个好的设计模式就可以解决这些问题,这在以后我们会继续介绍

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

期待后续解决方案。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!