策略模式通过将算法封装为独立类并实现统一接口,使算法可在运行时动态替换,从而避免冗长的条件判断,提升代码可维护性和扩展性;1. 定义统一策略接口如discountstrategy;2. 实现多个具体策略类如regulardiscount、vipdiscount、corporatediscount;3. 创建上下文类pricingcontext持有策略引用并支持运行时通过setstrategy切换;4. 在客户端根据需要动态设置策略并调用算法,实现灵活的行为变更,适用于折扣计算、支付方式、数据导出等场景,结合工厂模式可进一步简化策略创建,增强系统的可测试性与可扩展性。
策略模式是一种行为设计模式,它让你能在运行时动态地改变对象的行为或算法。它的核心思想是将算法封装在独立的类中,使它们可以互相替换,且与使用算法的客户端解耦。
为什么需要运行时算法替换?
在实际开发中,我们经常会遇到需要根据不同条件选择不同处理逻辑的情况。比如:
如果用 if-else 或 switch 判断实现,会导致代码臃肿、难以维护。策略模式正好解决这个问题。
如何使用策略模式实现运行时算法替换?
1. 定义统一的策略接口
先定义一个公共接口或抽象类,表示所有可互换的算法。
public interface DiscountStrategy { double calculate(double originalPrice); }
2. 实现具体策略类
每个具体算法实现该接口。
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折 } }
3. 创建上下文类,支持运行时切换策略
上下文类持有一个策略引用,可以在运行时设置或更换。
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); } }
4. 运行时动态选择和替换算法
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
接口,任何新算法都能无缝接入。
- 避免条件判断:不需要 if-else 判断用户类型,只需注入对应策略。
- 支持动态切换:同一个对象可以在不同时间使用不同策略。
- 便于测试:每个策略独立,可单独测试。
- 结合配置或用户输入:比如从数据库读取用户类型,自动选择对应策略。
常见优化方式:
- 使用工厂模式 + 策略模式,根据类型自动创建策略:
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()
就能完成,不复杂但容易忽略其威力。
评论(已关闭)
评论已关闭