那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程作为技术博主我经常收到读者的提问“这些高大上的术语到底是什么意思它们之间有什么关系”今天我们就用最接地气的语言把这些概念掰开了、揉碎了讲清楚。## 从“硬编码依赖”说起想象你在开发一个“通知系统”需要发送邮件。最直接的做法是pythonclass EmailService: def send_email(self, message: str): print(f发送邮件: {message})class NotificationService: def send(self, message: str): email EmailService() # 直接创建依赖对象 email.send_email(message)这种写法的问题在于NotificationService 强依赖于 EmailService。未来如果想改用短信通知、微信通知就必须修改 NotificationService 的代码。这违反了“开闭原则”对扩展开放对修改关闭。## 第一招依赖倒置原则DIP依赖倒置原则的核心思想是高层模块不应该依赖低层模块两者都应该依赖抽象。翻译成人话就是不要依赖具体实现要依赖接口或抽象类。遵循 DIP 的代码应该是pythonfrom abc import ABC, abstractmethod# 1. 定义抽象接口class MessageSender(ABC): abstractmethod def send(self, message: str): pass# 2. 实现具体发送方式class EmailSender(MessageSender): def send(self, message: str): print(f发送邮件: {message})class SmsSender(MessageSender): def send(self, message: str): print(f发送短信: {message})# 3. 高层模块依赖抽象而非具体实现class NotificationService: def __init__(self, sender: MessageSender): # 依赖抽象接口 self.sender sender def send(self, message: str): self.sender.send(message)# 4. 使用notifier NotificationService(EmailSender()) # 可以轻松切换实现notifier.send(你好世界)看到变化了吗NotificationService 不再关心底层是邮件还是短信它只依赖MessageSender这个抽象。这就是面向接口编程——编程时面向接口抽象而不是面向实现。## 第二招控制反转IoC“控制反转”这个词听起来很玄乎其实它描述的是依赖的控制权转移。在传统代码中类自己控制依赖的创建new 对象在 IoC 中这个控制权被反转给了外部容器。用代码理解python# 传统方式类自己控制依赖class UserController: def __init__(self): self.user_service UserService() # 自己创建依赖 def get_user(self, user_id): return self.user_service.find_user(user_id)# IoC 方式依赖由外部注入class UserController: def __init__(self, user_service: UserService): # 控制权反转依赖由外部提供 self.user_service user_service def get_user(self, user_id): return self.user_service.find_user(user_id)控制反转的核心就是“别打电话给我我们会打给你”好莱坞原则。你的代码不再主动创建依赖而是等着被框架或容器“喂”依赖。## 第三招依赖注入DI依赖注入是实现控制反转的一种具体手段。常见的注入方式有三种1.构造器注入最推荐2.属性注入通过 setter3.方法注入通过参数看一个完整的 Python 示例pythonfrom abc import ABC, abstractmethod# 接口定义class Database(ABC): abstractmethod def query(self, sql: str): passclass MySQLDatabase(Database): def query(self, sql: str): print(f执行 MySQL 查询: {sql}) return [data1, data2]class PostgreSQLDatabase(Database): def query(self, sql: str): print(f执行 PostgreSQL 查询: {sql}) return [data3, data4]# 依赖注入容器简单实现class Container: def __init__(self): self._services {} def register(self, name, service): self._services[name] service def resolve(self, name): return self._services.get(name)# 业务类class UserRepository: def __init__(self, database: Database): self.db database # 构造器注入 def get_users(self): return self.db.query(SELECT * FROM users)# 使用容器container Container()container.register(db, MySQLDatabase()) # 注册具体实现container.register(user_repo, UserRepository(container.resolve(db)))repo container.resolve(user_repo)users repo.get_users()print(users)## 四者关系图解-面向接口编程是指导思想编程时依赖抽象-依赖倒置原则是设计原则高层不依赖低层都依赖抽象-控制反转是设计思想控制权交给容器-依赖注入是具体实现手段通过构造器、属性等注入依赖它们的关系就像菜谱原则→ 烹饪方法思想→ 具体操作手段→ 最终菜品代码。## 实战案例从混乱到优雅看看重构前后对比混乱版反面教材pythonclass OrderService: def __init__(self): self.logger FileLogger() # 强依赖 self.email Gmail() # 强依赖 self.db MySQL() # 强依赖 def process_order(self, order): self.logger.log(处理订单) self.db.save(order) self.email.send(订单确认)优雅版遵循原则pythonclass OrderService: def __init__(self, logger: Logger, notifier: Notifier, repo: Repository): self.logger logger self.notifier notifier self.repo repo def process_order(self, order): self.logger.log(处理订单) self.repo.save(order) self.notifier.send(订单确认)# 可以轻松切换实现order_service OrderService( loggerCloudLogger(), notifierWeChatNotifier(), repoMongoRepository())## 总结这些术语看起来很唬人但本质就一句话别让你的代码“硬编码”依赖让依赖通过接口传进来。这样做的好处1.可测试性可以轻松替换为 Mock 对象2.可维护性修改一个组件不影响其他组件3.可扩展性新增实现无需修改现有代码4.松耦合组件之间通过接口通信记住依赖倒置是原则控制反转是思想依赖注入是手段面向接口是方法。下次再听到这些词你就知道它们其实在说同一件事把依赖的控制权从你的代码中解放出来。

相关新闻

如何让经典DirectX游戏在现代Windows上完美运行:DDrawCompat终极兼容指南

如何让经典DirectX游戏在现代Windows上完美运行:DDrawCompat终极兼容指南

如何让经典DirectX游戏在现代Windows上完美运行:DDrawCompat终极兼容指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh…

2026/7/27 0:06:58 阅读更多 →
IEA 15MW参考风力涡轮机:全球风电研究的标准化开源平台

IEA 15MW参考风力涡轮机:全球风电研究的标准化开源平台

IEA 15MW参考风力涡轮机:全球风电研究的标准化开源平台 【免费下载链接】IEA-15-240-RWT 15MW reference wind turbine repository developed in conjunction with IEA Wind 项目地址: https://gitcode.com/gh_mirrors/ie/IEA-15-240-RWT 在风电技术快速发展…

2026/7/27 0:06:58 阅读更多 →
XCOM 2终极模组管理器:AML启动器完整使用指南

XCOM 2终极模组管理器:AML启动器完整使用指南

XCOM 2终极模组管理器:AML启动器完整使用指南 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-…

2026/7/27 0:06:58 阅读更多 →

最新新闻

【剪映AI音量均衡实战指南】:20年音视频工程师亲授3步搞定人声与背景音自动平衡

【剪映AI音量均衡实战指南】:20年音视频工程师亲授3步搞定人声与背景音自动平衡

更多请点击: https://kaifayun.com 第一章:剪映AI音量均衡技术演进与行业价值 剪映AI音量均衡技术已从早期基于RMS(均方根)电平的静态归一化,跃迁至融合深度时频建模、说话人感知分割与上下文自适应增益调度的智能音频…

2026/7/27 0:24:09 阅读更多 →
把注解当“便利贴”——运行时自动识别字段

把注解当“便利贴”——运行时自动识别字段

一、这次又遇到了什么麻烦?每个订单对象有几十个字段,程序员每次写导出代码都要手动列出“商品名对应A列、价格对应B列”,太容易出错,而且以后字段一改,到处都要改。我们能不能在订单类的字段上直接写好“这是哪一列、…

2026/7/27 0:24:08 阅读更多 →
码垛机器人、龙门桁架、配套托盘输送机、缠绕机一体化机EAC认证

码垛机器人、龙门桁架、配套托盘输送机、缠绕机一体化机EAC认证

码垛机器人 龙门桁架 托盘输送机 缠绕机一体化成套线 EAC(CUTR)认证|上海经合 2026 专项落地方案 一、成套设备定义与俄海关刚性合规红线 整套一体化设备构成 整条物流末端码垛打包成套联动装置,完整单元包含: 码垛…

2026/7/27 0:23:08 阅读更多 →
,攻击者通过构造特殊的XML使其包含恶意外部实体。外部实体可以为服务器敏感文件,也可以为网络请求等,之后利用方式类似于文件包含和SS ...

,攻击者通过构造特殊的XML使其包含恶意外部实体。外部实体可以为服务器敏感文件,也可以为网络请求等,之后利用方式类似于文件包含和SS ...

深入解析XML外部实体注入(XXE)攻击:从原理到实战防御 什么是XXE攻击?XML外部实体注入(XML External Entity Injection,简称XXE)是一种针对XML解析器的安全漏洞。攻击者通过构造特殊的XML文档&a…

2026/7/27 0:23:08 阅读更多 →
AI Compass前沿速览:GPT--Codex 、宇树科技世界模型、InfiniteTalk美团数字人、ROMA多智能体框架、混元D .

AI Compass前沿速览:GPT--Codex 、宇树科技世界模型、InfiniteTalk美团数字人、ROMA多智能体框架、混元D .

AI Compass 前沿速览:GPT-Codex、宇树科技世界模型、InfiniteTalk 美团数字人、ROMA 多智能体框架、混元D 引言:AI 技术的多领域突破随着大语言模型、机器人控制、数字人交互等技术的飞速发展,2025 年第一季度涌现了多项引人瞩目的成果。从 O…

2026/7/27 0:23:08 阅读更多 →
LLM文档处理技术实践:从RAG到智能问答系统构建

LLM文档处理技术实践:从RAG到智能问答系统构建

这次我们来看一个关于LLM文档处理的技术主题。随着大语言模型在文档处理领域的应用越来越广泛,如何高效地将PDF、Word等文档传递给LLM进行问答和分析成为了实际工程中的关键问题。本文将从技术实践角度,系统梳理LLM文档处理的核心流程、工具选型和实战方…

2026/7/27 0:23:08 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻