什么是依赖注入(Dependency Injection)?它在 C++ 中是如何实现的?

什么是依赖注入(Dependency Injection)?它在 C++ 中是如何实现的?

依赖注入(Dependency Injection,DI)是一种设计模式,用于减少软件组件之间的耦合度,提高代码的可测试性、可维护性和可扩展性。在依赖注入中,组件的依赖关系不是在组件内部创建或硬编码的,而是通过外部提供的方式注入到组件中。

实现方式:
在 C++ 中,依赖注入可以通过以下几种方式实现:

构造函数注入:通过组件的构造函数接收依赖对象。

#include <iostream>class Service {
public:void execute() {std::cout << "Service executed" << std::endl;}
};class Client {
private:Service& service;public:Client(Service& s) : service(s) {}void run() {service.execute();}
};int main() {Service s;Client c(s);c.run();return 0;
}

成员变量注入:通过组件的成员变量接收依赖对象。

#include <iostream>class Service {
public:void execute() {std::cout << "Service executed" << std::endl;}
};class Client {
private:Service& service;public:Client() : service(Service()) {} // 成员变量初始化时注入依赖对象void run() {service.execute();}
};int main() {Client c;c.run();return 0;
}

函数参数注入:通过函数参数传递依赖对象。

#include <iostream>class Service {
public:void execute() {std::cout << "Service executed" << std::endl;}
};void run(Service& service) {service.execute();
}int main() {Service s;run(s);return 0;
}

接口注入:通过接口或抽象类定义依赖对象,由外部实现并注入到组件中。

#include <iostream>class IService {
public:virtual void execute() = 0;virtual ~IService() {}
};class Service : public IService {
public:void execute() override {std::cout << "Service executed" << std::endl;}
};class Client {
private:IService& service;public:Client(IService& s) : service(s) {}void run() {service.execute();}
};int main() {Service s;Client c(s);c.run();return 0;
}

通过以上方式,依赖对象的创建和管理被推迟到了组件外部,使得组件更加灵活、可测试和可复用,同时降低了组件之间的耦合度,提高了系统的可维护性和可扩展性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM类加载机制以及双亲委派模型的介绍

目录 1.类加载介绍 2.具体步骤 2.1加载 2.2验证 2.3准备 2.4解析 2.5初始化 3.加载过程中的策略-双亲委派模型 1.类加载介绍 类加载,指的是Java进程在运行的时候,把.class文件从硬盘读取到内存,并进行一系列校验解析的过程. .class文件>类对象.硬盘>内村 类加载…

spring-boot自定义网站头像(favicon.ico文件)

一、将ico文件存放到resources目录的static中的favicon下。 二、在application.properties文件中增加配置 spring.mvc.favicon.enabledfalse 三、如需页面引用如下&#xff1a; <link rel"icon" type"image/x-icon" ref"${request.contextPat…

智能驾驶规划控制理论学习03-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…

【计算机网络实践】在windows上配置Xshell和Xftp连接Ubuntu系统

hebut的课下作业&#xff0c;学习使用Xshell和Xftp连接Linux系统 1. 软件需求 Windows10/11、已安装VM虚拟机的ubuntu系统、Xshell、Xftp。 Xshell和Xftp在家庭/学校免费 - NetSarang Website (xshell.com)里面可以下载到&#xff0c;上面需要的两个软件都在&#xff0c;官网免…

运筹学_1.1.2 线性规划问题-图解法

1.1.2 线性规划问题-图解法 一、图解法求解步骤&#xff08;只适用于两个决策变量问题&#xff09;二、图解法作图实例三、图解法分析线性规划几种解的情况1、唯一最优解2、无穷多最优解3、无界解4、无解或无可行解 四、图解法的几点启示 一、图解法求解步骤&#xff08;只适用…

C++sort排序

前言&#xff1a; C语言的sort函数是一类用于数组排序的函数以下是其简单的使用&#xff1a; 1.头文件&#xff1a; #include<algorithm> 2.使用命名空间&#xff1a; using namespace std; 3.函数形式&#xff1a; sort(数组名,数组名元素个数,排序函数); 默认排…

深入浅出Redis(一):对象与数据结构

引言 Redis是一款基于键值对的数据结构存储系统&#xff0c;它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等 这篇文章主要围绕Redis中的对象与数据结构来详细说明键值对存储与简单丰富的数据结构这两大特点 Redi…

运筹学_1.1.4 线性规划问题-解的概念

1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量&#xff1b;非基变量、非基向量&#xff1b;基解、基可行解&#xff1b;四、最优解与可行解、基可行解的关系五、用例题&#xff08;枚举法&#xff09;巩固基解、基可行解、最优解三个概念1、例…

flyway实战

flyway是一款用来管理数据库版本的工具框架 一, 添加依赖 <dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId> </dependency> <dependency><groupId>org.springframework</groupId>&l…

第十一届蓝桥杯省赛第一场C++ A组 / B组《网络分析》(c++)

1.题目说明 小明正在做一个网络实验。 他设置了 n 台电脑&#xff0c;称为节点&#xff0c;用于收发和存储数据。 初始时&#xff0c;所有节点都是独立的&#xff0c;不存在任何连接。 小明可以通过网线将两个节点连接起来&#xff0c;连接后两个节点就可以互相通信了。 两…

代码随想录算法训练营第二十五天 | 216.组合总和III 17.电话号码的字母组合

216.组合总和III https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:result [] # 存放结果集sel…

实现一个移动端焦点轮播图

HTML结构&#xff1a; 创建一个轮播图的容器&#xff0c;并在其中放置轮播图片。 <div id"carousel"> <div class"carousel-item active"> <img src"image1.jpg" alt"Image 1"> </div> <div class&q…

Docker部署ZooKeeper

在分布式系统中,ZooKeeper是一个关键的组件,用于协调和管理多个节点之间的状态。本文将详细介绍如何使用Docker安装和部署ZooKeeper,包括非集群部署和集群部署两种情况。 非集群部署 前期准备 在开始之前,请确保你已经安装了Docker,并且拥有sudo权限。 关闭防火墙和SEL…

5、DVWA代码审计(2)

一、csrf 1、csrf(low) 限制 复现 GET /vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange HTTP/1.1 Host: ddd.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,…

电子电器架构 —— DoIP协议相关的介绍

电子电器架构 —— DoIP协议相关的介绍 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕…

监听者的力量:探索观察者模式和spring使用

观察者模式是一种对象行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系。 观察者模式通常用于实现分布式事件处理系统、新闻代理或MVC框架的一部分。在这种模式中&#xff0c;一个对象&#xff08;称为“主题”或“可观察对象”&#xff09;维护一系列依赖于它的对…

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【Spring IoC】实验四:特殊值处理

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Java4种创建线程方式

目录 一&#xff1a;继承Thread 二&#xff1a;重新Runnable接口 三&#xff1a;Callable 四&#xff1a;lambda 一&#xff1a;继承Thread public static void main(String[] args) {Thread1 t1new Thread1();t1.start(); } class Thread1 extends Thread {Overridepublic…

C++ //练习 10.16 使用lambda编写你自己版本的biggies。

C Primer&#xff08;第5版&#xff09; 练习 10.16 练习 10.16 使用lambda编写你自己版本的biggies。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*******************************************************************…