何为依赖注入(DI)?

2023-10-31

何为依赖注入(DEPENDENCY INJECTION)?

平常在写代码的时候,经常会在一个类中写出这样的一段代码(以 PHP 代码展示):

<?php

class Apple
{
    protected $color;

    public function __construct()
    {
        $color = new Red();
        $this->color = $color;
    }
}

在这段代码中,创建了一个 “苹果” 实例的同时,也创建了一个 “红色” 实例,这时,“苹果” 与 “红色” 之间,就产生了一个依赖。

依赖,就是我不能失去你,不然就不能存活了

如果需求变更,需要给 “苹果“ 增加一个青色的属性,在这一段代码中,似乎并没有什么大影响,我们只需要这样:

<?php
class Apple
{
    protected $color;

    public function __construct($color)
    {
        switch ($color){
            case "red":
                $color = new Red();
                break;
            case "green":
                $color = new Green();
                break;
        }
        $this->color = $color;
    }
}

给 ”苹果“ 加多一个属性就完成了,是不是看起来还是挺简单的。但是,当你需要添加一个其他属性的时候,例如:黄苹果。这个时候我们就需要重新编写这个 ”苹果“ 的类了,体验还是没有好转。

那么有什么解决的方法吗?既然在 ”苹果“ 内部实现他的色彩属性不是一个好的做法,何不把 ”苹果“ 色彩的构建放置到外部来实现呢?这就是我们标题所提到的 ”依赖注入“ 了。

依赖注入(dependency injection)

我们看下面一段代码

<?php
interface Color
{
    //在这里我们定义好一些接口
}

class Red implements Color
{
    //Red集成Color接口
}

class Green implements Color
{
    //Green集成Color接口
}

class Apple
{
    protected $color;

    public function __construct(Color $color)
    {
        $this->color = $color;
    }
}

现在,我们可以从外面传入一个实例化的类到 ”苹果“ 类中了,为了防止传入不相干的实例,我们在 ”苹果“ 类的 __construct 传入的实例进行了限制,传入实例必须实现 ”Color“ 接口。否则就会产生错误。

现在,我们只需要像下面这样就能创造出想要的苹果了:

    $color = new Red();

    $apple = new Apple($color);

这就是一个典型的依赖注入了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何为依赖注入(DI)? 的相关文章

随机推荐

  • 2023华为OD机试真题Java实现【动态规划/找出重复代码】

    题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码
  • MQ相关知识

    http bijian1013 iteye com category 359051 一 操作系统是否有安装该软件 查看版本 dspmqver 一 查看队列管理器运行状态 dspmq 显示结果中QMNAME表示MQ队列管理器的名称 STATU
  • docker基础

    目录 Docker架构图 Dockers常用命令 系统命令 版本信息 系统信息 帮助命令 镜像命令 docker image 搜索镜像 拉取镜像 查看本地镜像 删除镜像 容器命令 docker container 创建容器 查看容器 删除容
  • Golang架构直通车——理解gRPC

    文章目录 gRPC概述 关键技术 HTTP 2 二进制分帧层 数据流优先级 流控制 服务器推送 标头压缩 gRPC Stream gRPC Gateway gRPC概述 gRPC具有以下特点 基于HTTP 2和Protobuf3的通用rpc
  • 【满分】【华为OD机试真题2023 JAVA&JS】AI处理器组合

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 AI处理器组合 知识点数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某公司研发了一款高性能AI处理器 每台物理设备具备8颗AI处理器 编号分别为0 1 2
  • Doris--基础--06--设置内存

    Doris 基础 06 设置内存 1 问题 内存不够时 查询可能会出现 Memory limit exceeded 这是因为doris对每个用户默认设置内存限制为 4g 2 设置内存 2 1 查看当前内存 SHOW VARIABLES LI
  • 操作系统学习(十二)进程调度的时机、切换与过程、方式

    一 知识总览 二 进程调度的时机 需要进行进程调度与切换的情况 不能进行进程调度与切换的情况 1 中断 2 临界区 3 原子操作 临界资源 一段时间内只允许一个进程使用的资源 各个进程需要互斥地访问临界资源 临界区 访问临界资源的那段代码
  • Python——coco格式图像分割数据集转mask

    文章目录 单张coco转mask并显示 批量coco转mask 目前很多深度学习框架中的图像分割套件都使用image mask格式的标签数据 所以为了方便使用写了该脚本进行转换 单张coco转mask并显示 convert coco2mas
  • pycharm matplotlib.pyplot 绘图一闪而过解决办法

    今天在写python作业的时候发现用python绘图使用show方法出现了一点问题 什么问题呢 如题 绘制的窗口一闪而过 不留痕迹 怎么解决 问百度而得之 发现很多都是遇到不识别turtle的关键字 和我遇到的问题都不一样 这就很麻烦 然后
  • 7.Oracle19c RAC集群安装部署

    1 Oracle 19c RAC For Linux安装部署 https edu csdn net course detail 35792 2 Oracle数据库 底层原理解析 解析oracle数据库内部实现 详细讲解了Oracle数据库内
  • Android 状态栏处理三种方式

    记录三种对状态栏处理的方式 只对android 4 4版本以上有效果 第一种 全屏显示 屏蔽掉状态栏 一般是应用查看大图片或者闪屏界面应用 很简单 直接定义style
  • 使用uView根据权限动态配置uni-app中的tabBar

    转载一 动态配置权限 转载二 uniapp页面速成提效工具 uniapp uview ui 可视化 完全自由拖拽 一键生成flex代码网站 http aicode shagua wiki uni index html 十大特性 1 可视化
  • 【halcon】亚像素轮廓XLD

    XLD eXtended Line Descriptions XLD其实就是指的亚像素轮廓 如何理解亚像素 上一篇 halcon入门小技巧 提到的 threshold Image Region 128 255 这个呢 是给了一个灰度的范围
  • Spring Cloud微服务治理框架深度解析

    在学习一个技术之前 首先我们要了解它是做什么的 我们为什么要用它 不然看再多资料都理解不了 因此我们先来讲解下Spring Cloud Spring Cloud是一套微服务治理框架 几乎考虑到了微服务治理的方方面面 那么接下来具体说下 Sp
  • 【爬虫-反爬虫】系列一:反爬虫之签名(6)

    反爬虫之签名 6 本讲介绍的是一种比较麻烦的反爬虫策略 请求签名 请求签名 请求签名指在请求url中增加一个sign字段 通常取值为自定义字段的md5校验码 前面介绍的反爬虫策略基本上都有规律可寻 但签名很让人头疼 因为必须硬手段破解 也就
  • 【Flutter 2-11】Flutter手把手教程UI布局和Widget——列表ListView

    作者 弗拉德 来源 弗拉德 公众号 fulade me ListView ListView是在移动端非常常见的控件 在大多数的展示场景中都离不开ListView 在Flutter中对ListView的封装也非常好 简单几行代码就可以满足我们
  • redis基本操作

    redis是Remote Dictionary Service的简称 也就是远程字典服务 redis 是内存数据库 KV数据库 数据结构数据库 编译安装登录这些操作在之前已经介绍过 这里不再赘述 redis存储结构 redis有多种存储结构
  • 基于Keras的深度学习防止过拟合的策略:学习率、正则化、dropout、权重初始化、Early Stopping等

    本博客致力于记录心得体会 用简单通俗的语言分享经验和代码 记录我们学习的点滴 记录我们成长的过程 Keras包 Keras是深度学习中非常好用的一个工具包 我在刚开始接触深度学习的时候 尝试过用pytorch TensorFlow 但最后我
  • [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

    欢迎大家来到 Python从零到壹 在这里我将分享约200篇Python系列文章 带大家一起去学习和玩耍 看看Python这个有趣的世界 所有文章都将结合案例 代码和作者的经验讲解 真心想把自己近十年的编程经验分享给大家 希望对您有所帮助
  • 何为依赖注入(DI)?

    何为依赖注入 DEPENDENCY INJECTION 平常在写代码的时候 经常会在一个类中写出这样的一段代码 以 PHP 代码展示