Java学设计模式之策略模式
一、策略模式概念
1.1 什么是策略模式
策略模式是一种行为型设计模式,用于定义一系列算法,将每个算法封装在独立的策略类中,并使它们可以互相替换。策略模式可以使算法的变化独立于使用算法的客户端。
结构
策略模式通常包含以下几个要素:
-
Context(环境): 维护一个对策略对象的引用,并且负责调用所选策略的算法。
-
Strategy(策略): 定义所有支持的算法的公共接口。它可以是一个接口、抽象类或具体类。
-
ConcreteStrategy(具体策略): 实现了Strategy接口的具体算法。
二、策略模式代码
2.1 策略
public interface DiscountStrategy {
double applyDiscount(double amount);
}
2.2 具体策略
public class NoDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double amount) {
return amount;
}
}
public class TenPercentDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double amount) {
return amount * 0.9;
}
}
public class TwentyPercentDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double amount) {
return amount * 0.8;
}
}
2.3 环境
public class ShoppingCart {
private DiscountStrategy discountStrategy;
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double checkout(double amount) {
return discountStrategy.applyDiscount(amount);
}
}
2.4 测试类
public class StrategyPatternTest {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 不打折
cart.setDiscountStrategy(new NoDiscountStrategy());
double amount1 = cart.checkout(100);
System.out.println("不打折: " + amount1);
// 打9折
cart.setDiscountStrategy(new TenPercentDiscountStrategy());
double amount2 = cart.checkout(100);
System.out.println("打9折: " + amount2);
// 打8折
cart.setDiscountStrategy(new TwentyPercentDiscountStrategy());
double amount3 = cart.checkout(100);
System.out.println("打8折: " + amount3);
// 输出:
// 不打折: 100.0
// 打9折: 90.0
// 打8折: 80.0
}
}
三、总结
策略模式的优点包括:
- 可以轻松地切换不同的算法,使得系统更加灵活,易于扩展。
- 策略类之间相互独立,符合开闭原则,易于单元测试。
缺点包括:
- 客户端必须知道所有的策略,并且自行选择适合的策略,增加了客户端的复杂度。
- 如果策略类过多,可能会导致类的数量增加,使得代码变得复杂。