概述
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族(一组算法),分别封装起来,使它们之间可以互相替换,而且算法的变化可以独立于使用它的客户端。策略模式通常涉及到两个角色:策略接口和具体策略实现类。客户端使用策略接口调用具体策略实现类的方法,从而实现不同的行为。
优点:
- 策略模式将算法的实现与使用分离开来,使得各个算法的实现可以独立变化,增加新的算法只需要实现策略接口即可,不会对其他算法造成影响。
- 策略模式通过封装算法,使得客户端无需知道算法的具体实现细节,降低了客户端的复杂性。
- 策略模式利用组合,解决了继承带来的问题,更加灵活。
缺点:
- 策略模式会增加系统中策略类的数量,增加了代码的复杂度。
- 如果客户端需要经常切换策略,那么会带来一定的系统开销。
使用场景:
- 当需要根据不同的条件来执行不同的算法时,可以使用策略模式。
- 当一个类有多个行为,且这些行为在不同的场景下有不同的实现时,可以使用策略模式。
- 当需要实现算法的变化不影响客户端使用时,可以使用策略模式。
示例
一个常见的场景就是商场打折活动,不同的活动有不同的折扣策略。例如,周末活动有全场八折,VIP会员有九折等等。这些折扣策略可以看作是不同的算法,商场可以通过策略模式来实现灵活的配置。
下面是一个简单的示例代码,模拟了商场打折活动。DiscountStrategy 是策略接口,PercentageDiscountStrategy 和 FixedAmountDiscountStrategy 是具体的策略实现类,Client 是客户端代码,用来指定折扣策略。
// 策略接口
interface DiscountStrategy {
double applyDiscount(double totalPrice);
}
// 具体策略实现类:按比例打折
class PercentageDiscountStrategy implements DiscountStrategy {
private double discountPercentage;
public PercentageDiscountStrategy(double discountPercentage) {
this.discountPercentage = discountPercentage;
}
@Override
public double applyDiscount(double totalPrice) {
return totalPrice * (1 - discountPercentage);
}
}
// 具体策略实现类:减去固定金额
class FixedAmountDiscountStrategy implements DiscountStrategy {
private double fixedAmount;
public FixedAmountDiscountStrategy(double fixedAmount) {
this.fixedAmount = fixedAmount;
}
@Override
public double applyDiscount(double totalPrice) {
return totalPrice - fixedAmount;
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
double totalPrice = 100;
DiscountStrategy strategy = new PercentageDiscountStrategy(0.2);
double discountedPrice = strategy.applyDiscount(totalPrice);
System.out.println("折扣后的价格:" + discountedPrice);
strategy = new FixedAmountDiscountStrategy(20);
discountedPrice = strategy.applyDiscount(totalPrice);
System.out.println("折扣后的价格:" + discountedPrice);
}
}
输出结果:
折扣后的价格:80.0
折扣后的价格:80.0