策略模式:定义一系列算法,把每一个算法封装起来,并且使它们可互相替换。让算法的变化独立于使用算法的客户端。 核心角色:
Strategy(策略接口):统一算法行为接口
ConcreteStrategy(具体策略):实现不同算法
Context(环境上下文):持有策略对象,对外提供调用,委托策略执行逻辑
完整示例:支付方式策略
场景:订单支付,可以切换支付宝、微信、银行卡支付。
// 1. 策略接口:支付策略
public interface PaymentStrategy {
/**
* 支付
* @param amount 支付金额
*/
void pay(double amount);
}
// 2. 具体策略:支付宝支付
public class AliPayStrategy implements PaymentStrategy{
@Override
public void pay(double amount) {
System.out.println("使用【支付宝】支付,金额:" + amount + " 元");
}
}
// 具体策略:微信支付
public class WechatPayStrategy implements PaymentStrategy{
@Override
public void pay(double amount) {
System.out.println("使用【微信】支付,金额:" + amount + " 元");
}
}
// 具体策略:银行卡支付
public class BankCardPayStrategy implements PaymentStrategy{
@Override
public void pay(double amount) {
System.out.println("使用【银行卡】支付,金额:" + amount + " 元");
}
}
// 3. Context 上下文:订单,持有策略
public class OrderContext {
private PaymentStrategy paymentStrategy;
// 构造注入策略
public OrderContext(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
// 支持运行时动态切换策略
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
// 委托策略执行支付
public void doPay(double amount){
paymentStrategy.pay(amount);
}
}
// 客户端测试
public class StrategyDemo {
public static void main(String[] args) {
double money = 299.0;
// 选择支付宝策略
OrderContext order = new OrderContext(new AliPayStrategy());
order.doPay(money);
// 运行时切换为微信支付
order.setPaymentStrategy(new WechatPayStrategy());
order.doPay(money);
// 切换银行卡
order.setPaymentStrategy(new BankCardPayStrategy());
order.doPay(money);
// JDK8 lambda简化:不需要新建类,直接匿名实现策略接口
order.setPaymentStrategy(amount -> System.out.println("【现金】支付,金额:" + amount + "元"));
order.doPay(money);
}
}
输出结果
使用【支付宝】支付,金额:299.0 元
使用【微信】支付,金额:299.0 元
使用【银行卡】支付,金额:299.0 元
【现金】支付,金额:299.0元
策略模式要点
✅ 优点
算法独立封装,新增算法只需要新增实现类,符合开闭原则,不用修改原有代码
运行时动态替换算法
消除大量
if‑else / switch判断
❌ 缺点
策略变多,类数量会膨胀
客户端需要理解各个策略的区别,才能选择合适策略
消除 if‑else 改造示例(业务常用写法)
很多业务会配合简单工厂,根据类型获取策略,避免客户端直接 new 各个实现类
import java.util.HashMap;
import java.util.Map;
public class PaymentStrategyFactory {
private static final Map<String,PaymentStrategy> STRATEGY_MAP = new HashMap<>();
static {
STRATEGY_MAP.put("ALI",new AliPayStrategy());
STRATEGY_MAP.put("WECHAT",new WechatPayStrategy());
STRATEGY_MAP.put("BANK",new BankCardPayStrategy());
}
public static PaymentStrategy getStrategy(String payType){
return STRATEGY_MAP.get(payType);
}
public static void main(String[] args) {
String payType = "WECHAT";
PaymentStrategy strategy = getStrategy(payType);
OrderContext context = new OrderContext(strategy);
context.doPay(520);
}
}
JDK 中的策略模式典型应用
java.util.Comparator接口,Collections.sort(List, Comparator)
Comparator 就是 Strategy,不同比较器就是不同具体策略,可以动态替换排序算法。
// Comparator 策略示例
List<String> list = Arrays.asList("a","cc","bbb");
// 策略1:按字符串长度排序
Collections.sort(list, Comparator.comparingInt(String::length));
// 策略2:自然字典序
Collections.sort(list, String::compareTo);本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问