那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程作为技术博主我经常收到读者的提问“这些高大上的术语到底是什么意思它们之间有什么关系”今天我们就用最接地气的语言把这些概念掰开了、揉碎了讲清楚。## 从“硬编码依赖”说起想象你在开发一个“通知系统”需要发送邮件。最直接的做法是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/9/30 1:58:13 阅读更多 →
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/10/4 16:23:10 阅读更多 →
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/9/30 21:53:52 阅读更多 →

最新新闻

Java后端接入SignalR:从HTTP到HTTPS的完整落地与避坑指南

Java后端接入SignalR:从HTTP到HTTPS的完整落地与避坑指南

简介:面向Java与Android开发者的SignalR实时通信客户端库源码包,用于在非浏览器环境中接入ASP.NET SignalR服务,实现服务器向客户端实时推送。ASP.NET SignalR是一套成熟的实时Web通信库,而这份Java客户端扩展了它的使用边界&…

2026/10/11 20:38:24 阅读更多 →
Hermes自动化测试技能(1):用Jest/Pytest/Mocha搭建可复用的测试骨架

Hermes自动化测试技能(1):用Jest/Pytest/Mocha搭建可复用的测试骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 20:38:24 阅读更多 →
AMD Pensando vs BlueField-3:DPU实测性能差距与选型指南

AMD Pensando vs BlueField-3:DPU实测性能差距与选型指南

1. 从一颗DPU的实测数据说起第一次在实验室拿到AMD Pensando和BlueField-3这两块DPU做对比测试的时候,我心里其实是有预期的——Pensando被AMD收编之后,大家都等着看它到底能拿出什么成绩。结果跑完一轮基准测试,Pensando在特定负载下比BlueF…

2026/10/11 20:38:24 阅读更多 →
2026年十大AI Agent框架深度评测:TaoToken统一Key下谁是真正的王者

2026年十大AI Agent框架深度评测:TaoToken统一Key下谁是真正的王者

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 20:38:24 阅读更多 →
什么是IT资产自动发现?让CMDB和资产台账不再靠人工维护

什么是IT资产自动发现?让CMDB和资产台账不再靠人工维护

IT资产自动发现(Asset Discovery)是指通过扫描网络、读取设备信息等方式,自动识别企业环境中有哪些设备和软件、它们的配置是什么,并把结果同步到资产库的技术手段。 它解决的是 IT资产管理 里最老的一个难题:台账靠人…

2026/10/11 20:38:24 阅读更多 →
泥石流滑坡目标检测数据集:YOLO+VOC双格式解析与YOLOv8训练避坑指南

泥石流滑坡目标检测数据集:YOLO+VOC双格式解析与YOLOv8训练避坑指南

简介:目标检测数据集聚焦泥石流与滑坡两类地质灾害场景,面向需要训练YOLO、Faster R-CNN等检测模型的算法工程师、研究生及防灾减灾研究人员。数据集以VOC与YOLO双格式组织,JPEGImages、Annotations、labels三个文件夹一一对应,共…

2026/10/11 20:37:23 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →