朋友们,书接上文。接下来我们考虑用建造者模式去解决上篇文章结尾的问题。
首先,我们折扣接口和上篇已经实现策略代码都是不用改的。这不正是我们使用的设计模式的意义所在吗?保持了系统的可扩展性。直接上代码。
新增复合策略类(Composite Strategy):CompositePromotionStrategy.java
import java.util.List;
public class CompositePromotionStrategy implements PromotionStrategy {
private List<PromotionStrategy> promotionStrategies;
public CompositePromotionStrategy(List<PromotionStrategy> promotionStrategies) {
this.promotionStrategies = promotionStrategies;
}
@Override
public double applyPromotion(double price) {
for (PromotionStrategy strategy : promotionStrategies) {
price = strategy.applyPromotion(price);
}
return price;
}
}
新增建造者类(Builder):PromotionBuilder.java
import java.util.ArrayList;
import java.util.List;
public class PromotionBuilder {
private List<PromotionStrategy> promotions = new ArrayList<>();
public void addPromotion(PromotionStrategy promotionStrategy) {
promotions.add(promotionStrategy);
}
public PromotionStrategy build() {
return new CompositePromotionStrategy(promotions);
}
}
扩展工厂类接受的参数(这一步是不影响建造者模式,没有也行,只是想增强一下这个工厂类)
public class PromotionFactory {
public static PromotionStrategy createPromotionStrategy(String promotionType, double discount, double threshold, double reduction) {
switch (promotionType) {
case "discount":
return new DiscountPromotion(discount);
case "full_reduction":
return new FullReductionPromotion(threshold, reduction);
default:
throw new IllegalArgumentException("Unknown promotion type: " + promotionType);
}
}
}
测试方法
public class BuilderPatternDemo {
public static void main(String[] args) {
PromotionBuilder builder = new PromotionBuilder();
// 添加促销策略
builder.addPromotion(PromotionFactory.createPromotionStrategy("discount", 0.2, 0, 0));
builder.addPromotion(PromotionFactory.createPromotionStrategy("full_reduction", 0, 100, 30));
// 构建促销活动
PromotionStrategy promotionStrategy = builder.build();
double totalPrice = 150;
double finalPrice = promotionStrategy.applyPromotion(totalPrice);
System.out.println("Total Price: $" + totalPrice);
System.out.println("Final Price after Promotion: $" + finalPrice);
}
}