策略模式属于行为型设计模式,通过定义算法族并将其封装为独立的策略类,使得算法可以动态切换且与使用它的客户端解耦。该模式通过组合替代继承,符合开闭原则(对扩展开放,对修改关闭)。
// 1. 策略接口
public interface DiscountStrategy {
double applyDiscount(double originalPrice);
}
// 2. 具体策略实现
// 无折扣策略
public class NoDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double originalPrice) {
return originalPrice;
}
}
// 满减策略
public class FullReductionStrategy implements DiscountStrategy {
private final double fullAmount;
private final double reduction;
public FullReductionStrategy(double fullAmount, double reduction) {
this.fullAmount = fullAmount;
this.reduction = reduction;
}
@Override
public double applyDiscount(double originalPrice) {
return originalPrice >= fullAmount ?
originalPrice - reduction : originalPrice;
}
}
// 百分比折扣策略
public class PercentageDiscountStrategy implements DiscountStrategy {
private final double percentage;
public PercentageDiscountStrategy(double percentage) {
this.percentage = percentage;
}
@Override
public double applyDiscount(double originalPrice) {
return originalPrice * (1 - percentage);
}
}
// 3. 上下文类
public class PricingContext {
private DiscountStrategy strategy;
public PricingContext(DiscountStrategy strategy) {
this.strategy = strategy;
}
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double calculatePrice(double originalPrice) {
return strategy.applyDiscount(originalPrice);
}
}
// 4. 客户端使用
public class ECommerceApp {
public static void main(String[] args) {
// 初始策略:无折扣
PricingContext context = new PricingContext(new NoDiscountStrategy());
double price = 500.0;
System.out.println("原价: " + price);
System.out.println("默认策略价格: " + context.calculatePrice(price));
// 切换为满减策略(满400减100)
context.setStrategy(new FullReductionStrategy(400, 100));
System.out.println("满减策略价格: " + context.calculatePrice(price));
// 切换为百分比折扣(8折)
context.setStrategy(new PercentageDiscountStrategy(0.2));
System.out.println("百分比折扣价格: " + context.calculatePrice(price));
}
}
/* 输出:
原价: 500.0
默认策略价格: 500.0
满减策略价格: 400.0
百分比折扣价格: 400.0
*/
_________________________
| Strategy |
|------------------------|
| + executeAlgorithm() |
|________________________|
▲
____________|_____________
| | |
______▼______ ____▼______ _____▼______
| Concrete | | Concrete | | Concrete |
| StrategyA | | StrategyB | | StrategyC |
|___________| |___________| |___________|
▲
|
_____▼_____
| Context |
|-----------|
| - strategy|
|___________|
优势:
劣势:
// 策略模式在排序中的应用
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5);
// 使用不同排序策略
Collections.sort(numbers, Comparator.naturalOrder()); // 升序策略
Collections.sort(numbers, Comparator.reverseOrder()); // 降序策略
// 线程池拒绝策略实现
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, 4, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(10),
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
模式 | 核心区别 |
---|---|
工厂模式 | 关注对象创建,策略模式关注行为选择 |
命令模式 | 封装操作请求,策略模式封装算法实现 |
状态模式 | 状态转移自动发生,策略需要显式选择 |
public class DiscountStrategyFactory {
private static final Map<String, DiscountStrategy> strategies = new HashMap<>();
static {
strategies.put("NONE", new NoDiscountStrategy());
strategies.put("FULL_100", new FullReductionStrategy(400, 100));
strategies.put("20%OFF", new PercentageDiscountStrategy(0.2));
}
public static DiscountStrategy getStrategy(String strategyKey) {
return strategies.getOrDefault(strategyKey, new NoDiscountStrategy());
}
}
// 使用示例
DiscountStrategy strategy = DiscountStrategyFactory.getStrategy("20%OFF");
// 策略组合器
public class CombinedDiscountStrategy implements DiscountStrategy {
private final List<DiscountStrategy> strategies;
public CombinedDiscountStrategy(DiscountStrategy... strategies) {
this.strategies = Arrays.asList(strategies);
}
@Override
public double applyDiscount(double originalPrice) {
double currentPrice = originalPrice;
for (DiscountStrategy strategy : strategies) {
currentPrice = strategy.applyDiscount(currentPrice);
}
return currentPrice;
}
}
// 使用示例
DiscountStrategy combined = new CombinedDiscountStrategy(
new FullReductionStrategy(300, 50),
new PercentageDiscountStrategy(0.1)
);
// 通过@Qualifier注入不同策略
@Service
public class PaymentService {
private final PaymentStrategy strategy;
@Autowired
public PaymentService(@Qualifier("alipayStrategy") PaymentStrategy strategy) {
this.strategy = strategy;
}
}
// 策略接口
public interface PaymentStrategy {
void processPayment(BigDecimal amount);
}
// 具体策略实现
@Service("alipayStrategy")
public class AlipayStrategy implements PaymentStrategy { /*...*/ }
@Service("wechatPayStrategy")
public class WechatPayStrategy implements PaymentStrategy { /*...*/ }
public void setStrategy(DiscountStrategy strategy) {
if (strategy == null) {
throw new IllegalArgumentException("Strategy cannot be null");
}
this.strategy = strategy;
}
扩展示例:文件加密策略
// 策略接口
public interface EncryptionStrategy {
String encrypt(String content);
String decrypt(String encryptedContent);
}
// AES加密策略
public class AesEncryptionStrategy implements EncryptionStrategy {
// 实现AES加密算法...
}
// RSA加密策略
public class RsaEncryptionStrategy implements EncryptionStrategy {
// 实现RSA加密算法...
}
// 加密上下文
public class FileEncryptor {
private EncryptionStrategy strategy;
public FileEncryptor(EncryptionStrategy strategy) {
this.strategy = strategy;
}
public void encryptFile(String inputPath, String outputPath) {
String content = readFile(inputPath);
String encrypted = strategy.encrypt(content);
writeFile(outputPath, encrypted);
}
// 文件读写方法...
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。