依赖注入学习

1.介绍

依赖注入(Dependency Injection, DI)是一种软件设计模式,用于实现类与其依赖项之间的解耦。它的核心思想是,将类所依赖的对象通过外部注入的方式传递给它,而不是在类内部自行创建依赖对象。通过这种方式,代码变得更加灵活、可维护,并且有助于提高可测试性。

在面向对象编程中,类通常依赖于其他类来完成工作。例如,类 A 可能需要调用类 B 来执行一些功能。如果类 A 在内部直接创建类 B 的实例,那么这两者之间便紧密耦合,难以在不修改类 A 的情况下替换或测试类 B。

依赖注入 通过将依赖项(如类 B)从外部传递给类 A,可以解除两者之间的直接依赖。类 A 不再负责创建依赖项,而是依赖于外部提供的依赖项。

2.常见方式

2.1 构造函数注入具体类

// 具体的类
class Service {
public:
    void execute() {
        std::cout << "Executing service..." << std::endl;
    }
};

class Client {
private:
    Service* service;
public:
    // 通过构造函数注入依赖项
    Client(Service* s) : service(s) {}

    void doWork() {
        service->execute();
    }
};

int main() {
    Service s;
    Client c(&s);  // 注入依赖
    c.doWork();    // 使用注入的依赖
    return 0;
}

2.2 构造函数注入抽象类

// 抽象类,接口。
class IService {
public:
    virtual void execute() = 0;
};

class Service : public IService {
public:
    void execute() override {
        std::cout << "Executing service..." << std::endl;
    }
};

class Client {
private:
    IService* service; // 抽象类,
public:
    void setService(IService* s) {
        service = s;
    }

    void doWork() {
        service->execute();
    }
};

int main() {
    Service s;
    Client c;
    c.setService(&s);  // 注入实现接口的依赖
    c.doWork();
    return 0;
}

2.3 set函数注入

class Client {
private:
    Service* service;
public:
    void setService(Service* s) {
        service = s;
    }

    void doWork() {
        service->execute();
    }
};

int main() {
    Service s;
    Client c;
    c.setService(&s);  // 通过 setter 方法注入依赖
    c.doWork();
    return 0;
}

允许依赖在对象创建之后设置。

3.优点

  • 解耦:通过依赖注入,类不再负责创建依赖项,而是依赖外部传递的对象,这大大降低了类之间的耦合性。松耦合,loose coupling。

  • 可测试性:在测试时,可以方便地替换依赖项(如使用 mock 对象),从而更容易进行单元测试。

https://juejin.cn/post/7321967859242958857

依赖注入其实是控制反转(IOC)的一种实现方式。

需要控制反转的具体理由主要包括如下几点:

  • 实际只需要对象提供的服务,不需要关心对象从何而来。
  • 时空转变时,可能需要不同的对象来提供类似的服务,比如对于数据库操作服务,单元测试时需要模拟操作,而实际运行时需要真实操作。
  • 拥有对象的控制权时,需要不断的改造自己,麻烦且容易出问题。比如依赖项的构造函数变化、具体实现的更改等。
  • 将对象创建的控制权交出去,让外部场景来提供合适的服务对象。这可以让程序更容易组件化,更方便组合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW 系统诊断

LabVIEW 系统诊断是指通过各种工具和方法检测、评估、分析和解决 LabVIEW 程序和硬件系统中可能存在的故障和性能问题。系统诊断不仅涵盖软件层面的调试与优化&#xff0c;还包括硬件交互、数据传输、实时性能等方面的检查和分析。一个成功的系统诊断能够显著提升LabVIEW应用程…

基于 GEE 提取白莲种植范围

目录 1 方法原理 1.1 步骤一 1.2 步骤二 1.3 步骤三 1.4 步骤四 2 完整代码 3 运行结果 近年来&#xff0c;随着乡村振兴战略的提出&#xff0c;我国的农业种植模式呈现出多元化的趋势。白莲具有易种植、经济效益高的特点&#xff0c;由此被广泛种植&#xff0c;本文介绍…

el-table 自定义表头颜色

第一种方法&#xff1a;计算属性 <template><div><el-table:data"formData.detail"border stripehighlight-current-row:cell-style"{ text-align: center }":header-cell-style"headerCellStyle"><el-table-column fixed…

c++类和对象---上

文章目录 类的介绍 类的声明 1.1 类名 1.2 成员变量 1.3 成员函数 1.4 访问权限 类的定义 2.1 成员变量的初始化 2.2 成员函数的实现 对象的创建和销毁 3.1 默认构造函数 3.2 析构函数 3.3 拷贝构造函数 3.4 对象的实例化 3.5 对象的销毁 成员访问控制 4.1 公有成员 4.2 私有…

上汽乘用车研发流程

目的 最近刚入职主机厂&#xff0c;工作中所提到各个阶段名称与之前在供应商那边不一致&#xff0c;概念有点模糊&#xff0c;所以打算学习了解一番 概念 术语 EP: enginerring prototype car 工程样车 Mule Car: 骡子车 Simulator Car&#xff1a;模拟样车 PPV&#xff1a;…

阿里云发现后门webshell,怎么处理,怎么解决?

当收到如下阿里云通知邮件时&#xff0c;大部分管理员都会心里一惊吧&#xff01;出现Webshell&#xff0c;大概是网站被入侵了。 尊敬的 xxxaliyun.com&#xff1a; 云盾云安全中心检测到您的服务器&#xff1a;47.108.x.xx&#xff08;xx机&#xff09;出现了紧急安全事件…

vite5.x配置https

旧版的vite直接在config里面配置https&#xff1a;true即可&#xff0c;新版的麻烦一些。 1.准备工作 需要安装openssl 下载地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 找到合适的版本安装&#xff0c;配置好环境变量&#x…

深度学习与计算机视觉 (博士)

文章目录 零、计算机视觉概述一、深度学习相关概念1.学习率η2.batchsize和epoch3.端到端(End-to-End)、序列到序列(Seq-to-Seq)4.消融实验5.学习方式6.监督学习的方式(1)有监督学习(2)强监督学习(3)弱监督学习(4)半监督学习(5)自监督学习(6)无监督学习(7)总结&#xff1a;不同…

在AI浪潮中,RSS3为何会被低估其价值?有何潜力

​​RSS3 简介&#xff1a; RSS3 是一个去中心化网络索引和结构化开放信息&#xff0c;使其对于下一个 Twitter、Google 和 OpenAI 来说易于访问且有价值。凭借独特的数据子层价值子层设计&#xff0c; RSS3 网络推动了开放信息从索引到消费等的全生命周期&#xff0c;并建立了…

BMS应用软件开发 — 3 电池系统的组成

目录 1 电池的基本拓扑 2 已经被淘汰的CTM 3 早已经普及的CTP 4 集成度更高的CTC 5 刚性更好的CTB 1 电池的基本拓扑 相比于燃油车&#xff0c;虽然电动车在结构空间上灵活度更高&#xff0c;空间利用率也更好&#xff0c;但现有条件下无法像燃油车一样快速补能&#xff…

UE5 打包要点

------------------------- 1、需要环境 win sdk &#xff0c;大约3G VS&#xff0c;大约10G 不安装就无法打包&#xff0c;就是这么简单。 ----------------------- 2、打包设置 编译类型&#xff0c;开发、调试、发行 项目设置-地图和模式&#xff0c;默认地图 项目…

高等数学学习笔记 ☞ 一元函数微分的基础知识

1. 微分的定义 &#xff08;1&#xff09;定义&#xff1a;设函数在点的某领域内有定义&#xff0c;取附近的点&#xff0c;对应的函数值分别为和&#xff0c; 令&#xff0c;若可以表示成&#xff0c;则称函数在点是可微的。 【 若函数在点是可微的&#xff0c;则可以表达为】…

Redis查询缓存

什么是缓存&#xff1f; 缓存是一种提高数据访问效率的技术&#xff0c;通过在内存中存储数据的副本来减少对数据库或其他慢速存储设备的频繁访问。缓存通常用于存储热点数据或计算代价高的结果&#xff0c;以加快响应速度。 添加Redis缓存有什么好处&#xff1f; Redis 基…

3D立体无人机夜间表演技术详解

3D立体无人机夜间表演技术是一种结合了无人机技术、灯光艺术和计算机编程的创新表演形式。以下是该技术的详细解析&#xff1a; 一、技术基础 1. 无人机技术&#xff1a; 无人机通常采用四旋翼设计&#xff0c;具有强大的飞行控制能力&#xff0c;可以实现前飞、后飞、悬停、…

MATLAB深度学习实战文字识别

文章目录 前言视频演示效果1.DB文字定位环境配置安装教程与资源说明1.1 DB概述1.2 DB算法原理1.2.1 整体框架1.2.2 特征提取网络Resnet1.2.3 自适应阈值1.2.4 文字区域标注生成1.2.5 DB文字定位模型训练 2.CRNN文字识别2.1 CRNN概述2.2 CRNN原理2.2.1 CRNN网络架构实现2.2.2 CN…

H2数据库在单元测试中的应用

H2数据库特征 用比较简洁的话来介绍h2数据库&#xff0c;就是一款轻量级的内存数据库&#xff0c;支持标准的SQL语法和JDBC API&#xff0c;工业领域中&#xff0c;一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…

Android 10.0 授权app获取cpu温度和电池温度功能实现

1.前言 在10.0的系统定制化开发中&#xff0c;在开发某些产品的老化应用的时候&#xff0c;需要app获取cpu温度和电池 温度等功能&#xff0c;有些产品带温度传感器&#xff0c;大部分的产品都不包含温度传感器&#xff0c;所以就需要读取 sys下的相关节点来获取相关温度值 2.…

IDEA 撤销 merge 操作(详解)

作为一个开发者&#xff0c;我们都知道Git是一个非常重要的版本控制工具&#xff0c;尤其是在协作开发的过程中。然而&#xff0c;在使用Git的过程中难免会踩一些坑&#xff0c;今天我来给大家分享一个我曾经遇到的问题&#xff1a;在使用IDEA中进行merge操作后如何撤销错误的合…

WD5105同步降压转换器:9.2V-95V宽电压输入,4.5A大电流输出,95%高效率,多重保护功能

概述 • WD5105同步降压转换器 • 封装形式&#xff1a;QFN-20封装 • 应用场景&#xff1a;适用于车载充电器、电动车仪表、电信基站电源、电源适配器等 性能特点 • 输入电压范围&#xff1a;9.2V至95V • 输出电流&#xff1a;可提供4.5A连续负载电流 • 效率&#xff1a;高…

【C++】B2108 图像模糊处理

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述题目内容输入格式输出格式示例输入&#xff1a;输出&#xff1a; &#x1f4af;题目分析问题拆解 &#x1f4af;我的做法代码实现代码分析 &#x1f4af;老师的做法…