策略模式是行为型设计模式的核心成员,核心目标是定义一系列算法 / 行为,将其封装为独立的策略类,使它们可互相替换,让算法变化独立于使用算法的客户端。
一、策略模式核心实现
核心特点
将算法 / 行为逻辑与使用逻辑解耦,策略类实现统一接口,客户端通过注入不同策略对象动态切换行为,无需修改原有代码。
// 1. 策略接口:定义支付行为规范
interface PaymentStrategy {
void pay(double amount); // 统一支付方法
}
// 2. 具体策略1:微信支付
class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("微信支付:" + amount + "元");
}
}
// 3. 具体策略2:支付宝支付
class AliPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("支付宝支付:" + amount + "元");
}
}
// 4. 上下文:使用策略的客户端类
class PaymentContext {
private PaymentStrategy strategy; // 持有策略对象
// 动态注入策略
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
// 执行支付(委托给策略对象)
public void executePay(double amount) {
strategy.pay(amount);
}
}
// 5. 客户端测试
public class StrategyTest {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 切换为微信支付策略
context.setStrategy(new WeChatPayStrategy());
context.executePay(99.9); // 输出:微信支付:99.9元
// 切换为支付宝支付策略
context.setStrategy(new AliPayStrategy());
context.executePay(199.9); // 输出:支付宝支付:199.9元
}
}
优缺点
- ✅ 优点:算法切换灵活;符合开闭原则(新增策略仅加类);避免大量 if-else 判断;解耦算法与使用逻辑;
- ❌ 缺点:策略类数量随算法增多而增加;客户端需了解所有策略才能选择合适的实现。
适用场景
1、存在多种算法 / 行为,需动态切换(如支付方式、排序算法、校验规则);
2、避免使用大量 if-else/switch 判断不同业务逻辑;
3、算法需独立于客户端变化,且需复用不同场景。
最终目的:
灵活切换算法 / 行为;
SpringBoot 核心应用场景:
事务传播策略、负载均衡策略、ResourceLoader不同资源加载方式、环境配置加载策略