策略模式通过将算法封装为独立类并实现统一接口,使算法可在运行时动态替换,从而避免冗长的条件判断,提升代码可维护性和扩展性;1. 定义统一策略接口如discountstrategy;2. 实现多个具体策略类如regulardiscount、vipdiscount、corporatediscount;3. 创建上下文类pricingcontext持有策略引用并支持运行时通过setstrategy切换;4. 在客户端根据需要动态设置策略并调用算法,实现灵活的行为变更,适用于折扣计算、支付方式、数据导出等场景,结合工厂模式可进一步简化策略创建,增强系统的可测试性与可扩展性。

策略模式是一种行为设计模式,它让你能在运行时动态地改变对象的行为或算法。它的核心思想是将算法封装在独立的类中,使它们可以互相替换,且与使用算法的客户端解耦。
在实际开发中,我们经常会遇到需要根据不同条件选择不同处理逻辑的情况。比如:
如果用 if-else 或 switch 判断实现,会导致代码臃肿、难以维护。策略模式正好解决这个问题。
先定义一个公共接口或抽象类,表示所有可互换的算法。
public interface DiscountStrategy {
double calculate(double originalPrice);
}每个具体算法实现该接口。
public class RegularDiscount implements DiscountStrategy {
public double calculate(double originalPrice) {
return originalPrice * 0.95; // 95折
}
}
public class VipDiscount implements DiscountStrategy {
public double calculate(double originalPrice) {
return originalPrice * 0.8; // 8折
}
}
public class CorporateDiscount implements DiscountStrategy {
public double calculate(double originalPrice) {
return originalPrice * 0.7; // 7折
}
}上下文类持有一个策略引用,可以在运行时设置或更换。
public class PricingContext {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double applyDiscount(double price) {
if (strategy == null) {
throw new IllegalStateException("未设置折扣策略");
}
return strategy.calculate(price);
}
}public class Client {
public static void main(String[] args) {
PricingContext context = new PricingContext();
// 普通用户
context.setStrategy(new RegularDiscount());
System.out.println("普通用户价格: " + context.applyDiscount(100));
// VIP用户,切换策略
context.setStrategy(new VipDiscount());
System.out.println("VIP用户价格: " + context.applyDiscount(100));
// 企业用户,再次替换
context.setStrategy(new CorporateDiscount());
System.out.println("企业用户价格: " + context.applyDiscount(100));
}
}输出:
普通用户价格: 95.0 VIP用户价格: 80.0 企业用户价格: 70.0
DiscountStrategy
public class DiscountFactory {
public static DiscountStrategy getStrategy(String userType) {
return switch (userType.toLowerCase()) {
case "vip" -> new VipDiscount();
case "corporate" -> new CorporateDiscount();
default -> new RegularDiscount();
};
}
}调用时更简洁:
context.setStrategy(DiscountFactory.getStrategy("vip"));基本上就这些。策略模式的关键在于“把变化的算法独立出来”,通过组合而非继承来实现灵活性。运行时替换只要调用
setStrategy()
以上就是策略模式怎样使用 运行时算法替换技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号