“老师,您是怎么想到把这部分逻辑抽象成接口的?我就总想不到这种做法……”
这个问题像一把钥匙,打开了我对“抽象思维”的一次思考。 这不是一个技术细节问题,而是认知方式的区别。
今天,我写下这篇文章,分享我的理解:抽象,是每位工程师必须修炼的核心思维肌肉。
01
许多初学者理解抽象是“把重复代码抽成一个方法”。 这当然没错,但却只是较浅的表层。
真正的抽象,有三个核心能力:
✅ 识别模式:在表面不同中看到结构相似
✅ 分离变化与不变:把“可能变的”抽出来
✅ 构建层级结构:建立“代码-模块-系统”之间的边界感
👀 举个简单例子:
// 未抽象的结构
public class ReportService {
public void generatePDF() {
/* PDF逻辑 */
}
public void generateExcel() {
/* Excel逻辑 */
}
}
// 抽象思维后的结构
public interface ReportGenerator {
void generate(ReportData data);
}
public class PDFReportGenerator
implements ReportGenerator { ... }
public class ExcelReportGenerator
implements ReportGenerator { ... }
这里的重点不是用了接口,而是你意识到“文件格式是会变化的”,而生成流程是通用的。
02
临摹成熟项目,反推作者“为什么要抽象”
📌 建议练习:
选择Spring、MyBatis源码片段
手动画出类图、接口结构
写下作者“当时为什么这样设计”的可能思路
📘 反推训练笔记模板:
项目:订单导出模块
问题:PDF和Excel生成逻辑耦合
抽象点:格式变化 → 策略模式
重构后收益:支持新增格式不影响主流程
看到代码的“异味”,立刻联想到可用的设计模式
📒 四步法:
✅ 真实训练样例:
日期:2023-11-15
场景:用户注册流程有多种校验规则
模式匹配:策略模式 + 责任链模式
重构思路:抽象成 ValidationStrategy 接口
结果:可插拔、可配置校验规则,重构后代码减少40%
🧠 阶段三:抽象的多维度思考
提取出“订单”“商品”“用户”等业务核心模型
将业务流程(如支付)抽象为一系列职责分离的步骤
区分同步/异步、批处理/实时、幂等/非幂等处理
建立统一异常处理机制(全局异常 + 错误码体系)
📦 电商支付系统示例:
维度 | 抽象方式 | 应用模式 |
---|---|---|
支付行为 | 抽象成策略 | 策略模式 |
状态流转 | 分离状态管理 | 状态模式 |
动态增强 | 增加风控/日志 | 装饰器模式 |
消息通知 | 解耦事件处理 | 观察者模式 |
03
每周选取100行业务代码,执行:
抽卡3种设计模式 → 尝试在现有项目中组合应用
示例练习题:
抽中:策略模式 + 工厂模式 + 装饰器模式 在你负责的项目中,是否存在可以组合这些模式的场景? 如何在不引入复杂度的前提下提升可扩展性?
第五层:系统架构 [微服务/单体]
↓
第四层:组件设计 [模块划分]
↓
第三层:设计模式 [策略/工厂等]
↓
第二层:代码结构 [类/方法]
↓
第一层:具体实现 [代码行]
练习题: 任选一层,尝试向上或向下推导系统设计结构。
04
💡 顿悟时刻:第一次明白“多态”的意义不是语法,而是通过接口解耦
🧠 模式识别:不同项目中看到了同一模式的变体
🔄 业务抽象:从技术层面抽象提升到业务规则建模
🔭 方法论沉淀:形成“识别变化 → 提炼接口 → 设定边界”的抽象三部曲
抽象不是玄学,不是天赋,而是可以训练的结构化认知能力。
从今天开始,你可以:
坚持下来,你会发现: 你的代码不仅可读、可复用、可扩展,还具备“未来感”。