重构面向对象代码的关键是通过识别坏味道、按变化原因拆分类、用接口解耦依赖、以多态替代条件分支、剥离横切逻辑,使职责清晰、依赖松动、变化可控。

重构时落地面向对象设计原则,关键不是套术语,而是用具体动作把“职责清晰、依赖松动、变化可控”变成代码里的真实结构。重点在于识别坏味道、选对切入点、每步都让代码更易读、更易改、更易测。
按变化原因拆分类,守住单一职责
一个类如果同时处理用户创建、发送通知、生成报表、写审计日志,说明它被多个业务变化牵着走。登录策略改了、邮件模板换了、数据库迁移了——这些本该互不影响的事,却总要一起改同一个类。
- 把每种变化抽成独立类:比如 UserCreator 只管构造与保存用户,EmailNotifier 封装发信逻辑,AuditLogger 负责记录操作痕迹
- 原类保留委托方法,接口不变:如
UserManager.create(user)内部调用userCreator.create(user),调用方完全无感 - 拒绝模糊命名:删掉
Util、Helper这类词,改用PasswordValidator、OrderRefunder等带明确业务语义的名字
用接口代替实现,切断硬编码依赖
耦合常藏在 new 和静态调用里:Service 层直接 new JdbcTemplate,Controller 里写 new ObjectMapper(),等于把技术细节焊死在业务逻辑上。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 所有外部依赖通过构造函数注入,类型必须是接口(如
UserRepository、HttpClient) - 禁止跨层持有底层对象:Service 不该知道 RedisTemplate,只依赖
CacheService.get(key) - 测试时能直接传入
new MockUserRepository()或new InMemoryUserRepository(),就是依赖设计合格的标志
把 if-else 和 switch 替换为多态策略
像 if (type.equals("email")) 或 switch (format) 这类代码,本质是把多种行为塞进一个方法,任一规则调整都要动这个类,内聚已失效。
- 定义策略接口:
NotificationSender提供send(User user)方法 - 拆出具体实现:
EmailSender、SmsSender、PushSender各自封装协议和异常处理 - 运行时由工厂或 Spring 的
@Qualifier控制选择,业务类只依赖接口,新增渠道只需加个新类
剥离横切逻辑,还原干净业务主干
事务、日志、参数校验、序列化这些通用逻辑堆在业务方法里,会让核心流程被噪音淹没,也导致一个方法承担多重责任。
-
@Transactional不要放在 service 方法上,改由 AOP 切面统一管理,或下沉到 repository 层 - 用
@Valid配合自定义注解做参数校验,而不是在方法开头写一堆if (user == null) - 日志交给专门的
AuditLogger类或 AOP 处理,业务方法里只留关键业务日志,不掺杂技术埋点
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










