策略模式定义一系列算法族,将每个算法封装成独立类,并使它们可以相互替换。
核心目标:解耦算法的定义与使用,使算法能独立于客户端变化,消除复杂的条件判断。
if-else
或 switch-case
语句。典型应用:
execute()
)。根据用户选择调用不同的支付方式。
public interface PaymentStrategy {
void pay(double amount);
}
// 支付宝支付
public class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.printf("支付宝支付:%.2f元\n", amount);
}
}
// 微信支付
public class WechatPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.printf("微信支付:%.2f元\n", amount);
}
}
// 信用卡支付
public class CreditCardStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.printf("信用卡支付:%.2f元\n", amount);
}
}
public class PaymentContext {
private PaymentStrategy strategy;
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(double amount) {
if (strategy != null) {
strategy.pay(amount);
} else {
System.out.println("请选择支付方式");
}
}
}
public class Client {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 用户选择支付宝
context.setStrategy(new AlipayStrategy());
context.executePayment(100.50); // 输出:支付宝支付:100.50元
// 切换为微信支付
context.setStrategy(new WechatPayStrategy());
context.executePayment(200.00); // 输出:微信支付:200.00元
}
}
动态选择压缩算法(ZIP、RAR、7z)。
public interface CompressionStrategy {
void compress(String file);
}
public class ZipStrategy implements CompressionStrategy {
@Override
public void compress(String file) {
System.out.println("使用ZIP压缩:" + file);
}
}
public class RarStrategy implements CompressionStrategy {
@Override
public void compress(String file) {
System.out.println("使用RAR压缩:" + file);
}
}
public class CompressionContext {
private CompressionStrategy strategy;
public void setStrategy(CompressionStrategy strategy) {
this.strategy = strategy;
}
public void compressFile(String file) {
strategy.compress(file);
}
}
public class Client {
public static void main(String[] args) {
CompressionContext context = new CompressionContext();
context.setStrategy(new ZipStrategy());
context.compressFile("data.csv"); // 输出:使用ZIP压缩:data.csv
}
}
对比项 | 策略模式 | 工厂模式 |
---|---|---|
核心目标 | 动态切换算法 | 创建对象 |
关注点 | 行为(如何做) | 创建(谁来创建) |
对象关系 | 上下文持有策略对象 | 工厂生产对象 |
典型应用 | 支付方式、压缩算法 | 数据库连接、日志记录器 |
如何管理策略对象的创建?
策略模式是否会导致类数量增加?
如何选择默认策略?
策略模式如何支持算法参数传递?
execute(data)
)。实现一个 计算器
,支持加减乘除策略的动态切换。
设计一个 文件上传系统
,支持根据网络状况动态切换上传策略(普通上传、分块上传、断点续传)。
在微服务架构中,如何结合策略模式实现不同服务间的容错机制(如重试、熔断、降级)?
框架级应用:
Comparator
接口:通过策略模式实现自定义排序规则。ResourceLoader
:根据策略加载不同资源(类路径、文件系统、URL)。设计模式组合:
性能优化:
实际项目应用:
通过本教程,你可以掌握策略模式在算法管理和动态切换中的核心技巧,并能够灵活应用于需要多方案选择的业务场景。若有疑问或需要代码调试,欢迎随时交流!