核心是识别“谁在做什么”,将过程逻辑拆解为职责明确的对象并协作完成任务:先提取隐含实体及行为,再用策略/状态模式替代条件分支,接着引入领域服务协调跨实体操作,最后逐步迁移重构。

核心是识别“谁在做什么”,把过程逻辑拆解成职责明确的对象,再通过协作完成任务。不是简单套用类和方法,而是重新思考问题的结构。
识别可封装的实体和行为
面向过程代码常把数据和操作混在一起,比如一堆处理订单的函数:计算总价、校验库存、生成发票、发送通知。这些其实都围绕“订单”这个核心概念展开。重构第一步就是找出这类隐含的实体(如订单、商品、用户、支付方式),以及它们天然该负责的行为。
例如,一段计算逻辑:
double total = itemPrice * quantity - discount + tax;
这不是孤立公式,它属于某个业务上下文——比如“购物车结算”。那就该让 ShoppingCart 类自己提供 calculateTotal() 方法,内部调用 Item.getPrice()、Promotion.applyTo(cart) 等,而不是在主流程里拼接数字。
用策略/状态模式替代条件分支
大段 if-else 或 switch 处理不同业务类型(如不同支付方式、不同发货规则),是臃肿过程代码的典型特征。这类逻辑往往随需求增长越来越难维护。
将其抽取为独立策略类更清晰:
- 定义统一接口:PaymentProcessor,含 process(PaymentContext ctx)
- 实现具体类:AlipayProcessor、WechatPayProcessor、CreditCardProcessor
- 运行时根据支付类型选择对应实例,主流程不再关心判断细节
这样新增支付方式只需加一个类,不改动原有逻辑,也便于单元测试。
引入领域服务协调跨实体操作
不是所有行为都属于某个单一实体。比如“下单”动作,需检查库存、冻结库存、创建订单、扣减账户余额、发通知——涉及多个对象协作。
这时不要把全部逻辑塞进 Order 类,也不要在 main 方法里硬写流程。应提取为一个无状态的领域服务:OrderService.placeOrder(Cart cart, User user)。它只负责编排,调用 InventoryService.reserve()、OrderRepository.save()、NotificationService.send() 等,各司其职。
这种分层让每部分专注自身职责,也方便替换实现(比如用消息队列异步发通知)。
逐步迁移,别追求一步到位
重构不是重写。从最痛、最常改的一块入手,比如把“生成报表”那段 300 行函数,先封装成 ReportGenerator 类,保留原有输入输出接口,内部逐步替换成对象协作。确保每次小改后测试仍通过。
常用技巧包括:
- 先提取方法(Extract Method),再将方法和相关变量一起升格为新类
- 用构造函数或 Builder 模式封装复杂初始化,避免一堆 setXXX() 调用
- 把全局变量或配置参数转为依赖注入,提升可测性和灵活性
重构目标不是“看起来更 OOP”,而是让代码更容易理解、修改和验证。对象是否合理,就看它有没有清晰的边界、单一的意图,以及能否独立演化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











