首页/新闻资讯/正文详情

【设计模式之美】重构三之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?

发布时间:2026/11/3 1:13:09 来源:云帆数科 栏目:资讯中心
【设计模式之美】重构三之解耦方法论:如何通过封装、抽象、模块化、中间层等解耦代码?
文章目录一. “解耦”概述二. 如何给代码“解耦”1. 封装与抽象2. 中间层2.1. 引入中间层能**简化模块或类之间的依赖关系**。2.2. 引入中间层可以起到过渡的作用能够让开发和重构同步进行不互相干扰。3. 模块化4. 其他设计思想和原则4.1. 单一职责原则4.2. 基于接口而非实现编程4.3. 依赖注入4.4. 多用组合少用继承4.5. 迪米特法则一. “解耦”概述重构可以分为大规模高层重构简称“大型重构”和小规模低层次重构简称“小型重构”。通过解耦对代码重构就是保证代码不至于复杂到无法控制的有效手段。代码是否需要“解耦”看修改代码会不会牵一发而动全身。依赖关系是否复杂把模块与模块之间、类与类之间的依赖关系画出来根据依赖关系图的复杂性来判断是否需要解耦重构。二. 如何给代码“解耦”1. 封装与抽象封装和抽象作为两个非常通用的设计思想可以应用在很多设计场景中比如系统、模块、lib、组件、接口、类等等的设计。封装和抽象可以有效地隐藏实现的复杂性隔离实现的易变性给依赖的模块提供稳定且易用的抽象接口。比如Unix 系统提供的 open() 文件操作函数我们用起来非常简单但是底层实现却非常复杂涉及权限控制、并发控制、物理存储等等。我们通过将其封装成一个抽象的 open() 函数能够有效控制代码复杂性的蔓延将复杂性封装在局部代码中。因为 open() 函数基于抽象而非具体的实现来定义所以我们在改动 open() 函数的底层实现的时候并不需要改动依赖它的上层代码也符合我们前面提到的“高内聚、松耦合”代码的评判标准。2. 中间层2.1. 引入中间层能简化模块或类之间的依赖关系。下面这张图是引入中间层前后的依赖关系对比图。在引入数据存储中间层之前A、B、C 三个模块都要依赖内存一级缓存、Redis 二级缓存、DB 持久化存储三个模块。在引入中间层之后三个模块只需要依赖数据存储一个模块即可。从图上可以看出中间层的引入明显地简化了依赖关系让代码结构更加清晰。2.2. 引入中间层可以起到过渡的作用能够让开发和重构同步进行不互相干扰。比如某个接口设计得有问题我们需要修改它的定义同时所有调用这个接口的代码都要做相应的改动。如果新开发的代码也用到这个接口那开发就跟重构冲突了。为了让重构能小步快跑我们可以分下面四个阶段来完成接口的修改。引入一个中间层包裹老的接口提供新的接口定义。新开发的代码依赖中间层提供的新接口。将依赖老接口的代码改为调用新接口。确保所有的代码都调用新接口之后删除掉老的接口。这样每个阶段的开发工作量都不会很大都可以在很短的时间内完成。重构跟开发冲突的概率也变小了。3. 模块化合理地划分模块能有效地解耦代码提高代码的可读性和可维护性。所以我们在开发代码的时候一定要有模块化意识将每个模块都当作一个独立的 lib一样来开发只提供封装了内部实现细节的接口给其他模块使用这样可以减少不同模块之间的耦合度。实际上从刚刚的讲解中我们也可以发现模块化的思想无处不在像 SOA、微服务、lib 库、系统内模块划分甚至是类、函数的设计都体现了模块化思想。如果追本溯源模块化思想更加本质的东西就是分而治之。4. 其他设计思想和原则4.1. 单一职责原则高内聚会让代码更加松耦合而实现高内聚的重要指导原则就是单一职责原则。模块或者类的职责设计得单一而不是大而全那依赖它的类和它依赖的类就会比较少代码耦合也就相应的降低了。4.2. 基于接口而非实现编程基于接口而非实现编程能通过接口这样一个中间层隔离变化和具体的实现。这样做的好处是在有依赖关系的两个模块或类之间一个模块或者类的改动不会影响到另一个模块或类。实际上这就相当于将一种强依赖关系强耦合解耦为了弱依赖关系弱耦合。4.3. 依赖注入跟基于接口而非实现编程思想类似依赖注入也是将代码之间的强耦合变为弱耦合。尽管依赖注入无法将本应该有依赖关系的两个类解耦为没有依赖关系但可以让耦合关系没那么紧密容易做到插拔替换。4.4. 多用组合少用继承继承是一种强依赖关系父类与子类高度耦合且这种耦合关系非常脆弱牵一发而动全身父类的每一次改动都会影响所有的子类。组合关系是一种弱依赖关系这种关系更加灵活所以对于继承结构比较复杂的代码利用组合来替换继承也是一种解耦的有效手段。4.5. 迪米特法则迪米特法则讲的是不该有直接依赖关系的类之间不要有依赖有依赖关系的类之间尽量只依赖必要的接口。从定义上我们明显可以看出这条原则的目的就是为了实现代码的松耦合。《设计模式之美》-- 王争

相关推荐

2024年Java算法
2024年Java算法

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

Ubuntu 优化 与 问题记录
Ubuntu 优化 与 问题记录

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

【运维】linux安装oracle客户端、安装mysql
【运维】linux安装oracle客户端、安装mysql

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

JoyAI-Image-Edit-Plus-Diffusers社区贡献指南:如何参与开源项目开发
JoyAI-Image-Edit-Plus-Diffusers社区贡献指南:如何参与开源项目开发

JoyAI-Image-Edit-Plus-Diffusers社区贡献指南:如何参与开源项目开发 欢迎来到JoyAI-Image-Edit-Plus-Diffusers社区!🎉 作为一款基于Diffusers的AI图像编辑工具,我们致力于为开发者提供简单高效的图像处理解决方案。本指南将为你… · 2026/11/3 1:41:16

Qwen3-Omni:阿里开源全模态大模型,多模态交互迈入“端到端“时代
Qwen3-Omni:阿里开源全模态大模型,多模态交互迈入“端到端“时代

Qwen3-Omni:阿里开源全模态大模型,多模态交互迈入"端到端"时代 导语 阿里巴巴Qwen团队发布开源全模态大模型Qwen3-Omni,首次实现文本、图像、音频、视频四种模态的原生端到端处理,在36项音频及视听基准测试中创下32项… · 2026/11/3 1:41:16

2025视频生成效率革命:WanVideo FP8量化模型如何让消费级显卡跑出专业级效果
2025视频生成效率革命:WanVideo FP8量化模型如何让消费级显卡跑出专业级效果

2025视频生成效率革命:WanVideo FP8量化模型如何让消费级显卡跑出专业级效果 导语 阿里WanVideo团队推出的FP8量化模型(WanVideo_comfy_fp8_scaled),通过优化的FP8量化技术与ComfyUI生态深度整合,在消费级显卡上实现… · 2026/11/3 1:41:16

8GB显存玩转电影级视频生成:阿里WanVideo FP8技术重构创作门槛
8GB显存玩转电影级视频生成:阿里WanVideo FP8技术重构创作门槛

8GB显存玩转电影级视频生成:阿里WanVideo FP8技术重构创作门槛 导语 阿里巴巴通义万相团队推出的WanVideo_comfy_fp8_scaled模型,通过FP8量化技术将14B参数视频模型压缩至消费级GPU可运行体量,配合ComfyUI可视化节点实现专业级视频创作&… · 2026/11/3 1:41:16

算力直降48%:Moonlight-16B-A3B凭Muon优化器改写大模型效率规则
算力直降48%:Moonlight-16B-A3B凭Muon优化器改写大模型效率规则

算力直降48%:Moonlight-16B-A3B凭Muon优化器改写大模型效率规则 你还在为大模型训练成本高企而头疼吗?月之暗面开源的Moonlight-16B-A3B模型给出新解:通过MoE架构与Muon优化器组合,实现总参数160亿仅激活30亿的效率突破&#xff… · 2026/11/3 1:41:16

Instant-NuRec安全与伦理考量:在自动驾驶仿真中的责任使用指南
Instant-NuRec安全与伦理考量:在自动驾驶仿真中的责任使用指南

Instant-NuRec安全与伦理考量:在自动驾驶仿真中的责任使用指南 Instant-NuRec作为一款高效的图像转3D高斯模型,在自动驾驶仿真场景构建中展现出显著价值。它能在2分钟内将多视角图像转换为高精度3D高斯点云,为自动驾驶算法测试提供关键场景素… · 2026/11/3 1:40:16

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

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

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

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

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

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

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码