行为型-策略模式
2026/1/15大约 2 分钟Java设计模式行为型模式策略模式Java设计模式面向对象架构设计最佳实践代码优化
概述
策略模式(Strategy Pattern)定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用场景
- 多个类只区别在表现行为不同,可以使用策略模式
- 需要在不同情况下使用不同的策略(算法)
- 需要屏蔽算法规则
角色组成
- Strategy(抽象策略):定义所有支持的算法的公共接口
- ConcreteStrategy(具体策略):实现具体的算法
- Context(环境类):持有一个Strategy的引用
代码实现
1. 抽象策略
public interface PaymentStrategy {
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 BankCardStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("银行卡支付: " + amount + " 元");
}
}3. 环境类
public class PaymentContext {
private PaymentStrategy strategy;
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(double amount) {
if (strategy == null) {
throw new IllegalStateException("请选择支付方式");
}
strategy.pay(amount);
}
}4. 客户端
public class Client {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 使用支付宝
context.setStrategy(new AlipayStrategy());
context.executePayment(100.0);
// 切换到微信
context.setStrategy(new WeChatPayStrategy());
context.executePayment(200.0);
// 切换到银行卡
context.setStrategy(new BankCardStrategy());
context.executePayment(300.0);
}
}# 输出
支付宝支付: 100.0 元
微信支付: 200.0 元
银行卡支付: 300.0 元类图
结合工厂模式
public class PaymentStrategyFactory {
private static Map<String, PaymentStrategy> strategies = new HashMap<>();
static {
strategies.put("alipay", new AlipayStrategy());
strategies.put("wechat", new WeChatPayStrategy());
strategies.put("bank", new BankCardStrategy());
}
public static PaymentStrategy getStrategy(String type) {
return strategies.get(type);
}
}
// 使用
PaymentStrategy strategy = PaymentStrategyFactory.getStrategy("alipay");
strategy.pay(100.0);JDK 中的应用
java.util.Comparatorjavax.servlet.http.HttpServletjava.util.concurrent.ThreadPoolExecutor的拒绝策略
// Comparator 策略示例
List<String> list = Arrays.asList("banana", "apple", "cherry");
// 策略1:自然排序
list.sort(Comparator.naturalOrder());
// 策略2:长度排序
list.sort(Comparator.comparingInt(String::length));
// 策略3:逆序
list.sort(Comparator.reverseOrder());优缺点
优点:
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
缺点:
- 策略类会增多
- 所有策略类都需要对外暴露
