面向对象组合替代if-else的核心是将判断逻辑封装为可装配的策略类,通过strategychain管理执行链,结合工厂与配置驱动装配,并将原始数据升级为语义化领域对象。

直接用面向对象组合替代层层 if-else,核心是把“判断逻辑”变成“可装配的对象”,让条件分支从代码结构里消失,转为运行时的组合关系。不靠删减缩进,而是换掉思考维度。
把判断条件封装成策略类
每个明确的业务分支(比如“VIP用户折扣”“新用户免邮”“海外订单加急”)都定义一个独立策略类,实现统一接口:
- 接口只声明一个行为方法,如 apply(Order order)
- 每个策略类专注一件事:校验是否匹配 + 执行对应动作
- 避免在策略内部再写 if 判断——它自己就是被选中的那个“if分支”
用组合容器管理策略链
不再靠 if-else 顺序判断,而是把多个策略组织成一条可配置的执行链:
- 创建 StrategyChain 类,持有 List
,按需添加或排序 - 遍历执行:对每个策略调用 canHandle(order),第一个返回 true 的就执行 handle(order)
- 支持短路(找到即停)、跳过(条件不满足继续)、甚至并行(如风控多规则校验)
用工厂+配置驱动策略装配
避免硬编码 new 实例,让策略组合变得可配置、易替换:
- 定义策略标识,如 @OrderHandlerType("vip") 注解
- 启动时扫描所有带注解的类,自动注册进策略容器
- 或从配置文件读取启用的策略列表,动态加载——新增一种订单类型,只需加类+配名称,不改主流程
把原始数据升级为领域对象
消除因参数松散导致的重复判断,比如反复检查 user != null && user.getRole() != null && "ADMIN".equals(user.getRole()):
- 封装 User 为不可变对象,内置 isVip()、hasPermission(String) 等语义化方法
- 把字符串角色码替换成枚举或 Role 类,行为与状态一起封装
- 判断逻辑从外部转移到对象内部,调用方只剩 if (user.isVip()) { ... } ——干净、可测、不易错











