策略模式
策略模式:允许定义一系列算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化可以独立于使用它们的客户端。
构成部分
- Context(上下文):维护一个对策略对象的引用,该对象用于客户端调用。
- Strategy(策略接口):定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,以便环境角色可以使用这个接口来调用不同的算法。
- ConcreteStrategy(具体策略类):实现了策略接口,提供具体的算法实现。
java举例
// 策略接口
interface DiscountStrategy {
double calculateDiscount(double totalAmount);
}
// 具体策略1:百分比折扣
class PercentageDiscountStrategy implements DiscountStrategy {
private double percentage;
public PercentageDiscountStrategy(double percentage) {
this.percentage = percentage;
}
@Override
public double calculateDiscount(double totalAmount) {
return totalAmount * percentage;
}
}
// 具体策略2:固定金额折扣
class FixedAmountDiscountStrategy implements DiscountStrategy {
private double amount;
public FixedAmountDiscountStrategy(double amount) {
this.amount = amount;
}
@Override
public double calculateDiscount(double totalAmount) {
return amount;
}
}
// 上下文类
class Order {
private DiscountStrategy discountStrategy;
public Order(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double getTotalAmount() {
// 假设订单总金额为1000元
return 1000.0;
}
public double calculateDiscount() {
return discountStrategy.calculateDiscount(getTotalAmount());
}
}
// 客户端使用
public class ECommercePlatform {
public static void main(String[] args) {
// 使用百分比折扣策略
Order order1 = new Order(new PercentageDiscountStrategy(0.10)); // 10%折扣
double discount1 = order1.calculateDiscount();
System.out.println("折扣金额: " + discount1);
// 使用固定金额折扣策略
Order order2 = new Order(new FixedAmountDiscountStrategy(50.0)); // 固定减免50元
double discount2 = order2.calculateDiscount();
System.out.println("折扣金额: " + discount2);
}
}
输出
折扣金额: 100.0
折扣金额: 50.0
我们定义了一个DiscountStrategy接口,并实现了两个具体策略类:PercentageDiscountStrategy(百分比折扣)和FixedAmountDiscountStrategy(固定金额折扣)。
然后,我们创建了一个Order类作为上下文类,它包含一个对DiscountStrategy对象的引用,并提供了计算折扣的方法。
在客户端代码中,我们根据不同的需求创建了不同的订单对象,并使用了不同的折扣策略来计算折扣金额。