策略模式通过将条件分支逻辑提取为独立策略类,用统一接口封装不同实现,使新增分支无需修改原有代码。核心步骤:定义策略接口、实现各策略类、运行时动态选择策略,配合spring可自动装配并用map管理策略。

用策略模式替代 Java 中的条件分支,核心是把“不同条件对应不同行为”这件事,从方法内部的 if-else 搬到对象创建环节,让每个行为由独立类承担,而不是靠一堆判断来切换。
识别适合策略模式的场景
当你的 if-else 分支满足以下特征时,就该考虑策略模式:
- 分支依据的是明确的业务类型或规则类别(比如支付方式、用户等级、折扣类型、消息渠道)
- 每个分支执行的是同一件事的不同实现(如都做“计算”“发送”“校验”,只是逻辑不同)
- 未来很可能新增分支(如加一种新支付方式),但不希望每次都要改原有 if-else 块
- 各分支逻辑较复杂,堆在同一个方法里可读性差、难测试、易出错
三步完成策略模式落地
第一步:定义统一策略接口
声明所有策略共有的方法签名,不包含任何具体实现。
例如处理不同折扣:
double apply(double amount);
}
第二步:为每种分支写一个实现类
每个类只专注自己那一种规则,不关心其他分支是否存在。
public double apply(double amount) { return amount * 0.25; }
}
class CouponDiscount implements DiscountStrategy {
public double apply(double amount) { return Math.min(50, amount * 0.15); }
}
第三步:在运行时选策略,而非写判断
把条件判断收缩到策略选择这一步,后续调用全部走统一接口。
case VIP -> new VIPDiscount();
case COUPON -> new CouponDiscount();
default -> new DefaultDiscount();
};
double finalPrice = strategy.apply(originalPrice);
配合 Spring 自动装配更省事
如果使用 Spring,可以给每个策略类加 @Component 注解,并按类型或名称注入:
- 用 Map
存所有策略,key 是类型标识(如 "vip") - 根据参数直接 get(key),避免硬编码 switch 或 if
- 新增策略只需加个类、打个注解,无需改调度逻辑
和状态模式别混了
策略模式管的是“我有多种做法,这次选哪一种”;状态模式管的是“我现在处于哪个阶段,这个阶段该怎么做”。
前者强调算法/规则的可替换性,后者强调对象自身状态变化带来的行为差异。
如果你的 if-else 是围绕“订单当前是待支付还是已发货”这类生命周期判断,更适合用状态模式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











