目录
什么是策略模式
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。主要用在有多种算法相似的情况下,避免大量使用 if...else 和 switch-case 所带来的复杂和难以维护的问题。
策略模式结构
-
Strategy 接口定义了一个算法族,它们都实现了strategyMethod () 方法。
-
Context 是使用到该算法族的类,其中的 strategyMethod () 方法会调用 strategyMethod,setStrategy(Strategy strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。
策略模式的优点和缺点
优点:
- 通过使用不同的策略类,避免了在客户端代码中使用大量的 if else 语句。
- 可以在运行时选择不同的算法,而不需要修改客户端代码。
- 可以通过增加新的策略类来扩展新的算法,而无需修改现有代码。
缺点:
- 客户端必须知道所有的策略,并且自行决定使用哪一种策略。
- 代码中会产生非常多的策略类,增加策略的维护成本。
项目实战
实际场景
购买商品时候使用的各种类型优惠券(打折、满减、直减)金额计算。
代码实现(策略模式+工厂模式)
优惠券折扣金额的策略接口
public interface CouponCalculationStrategy {
/**
* 计算折扣
*
* @param template 优惠券模板
* @param orderAmount 订单金额
* @return 优惠后金额
*/
BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount);
}
优惠金额策略
打折
public class DiscountCalculationStrategy implements CouponCalculationStrategy {
@Override
public BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount) {
DiscountCouponDO discountCoupon = (DiscountCouponDO) template;
return orderAmount.multiply(BigDecimal.valueOf(discountCoupon.getDiscountRate()));
}
}
直减
public class FixedDiscountCalculationStrategy implements CouponCalculationStrategy {
@Override
public BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount) {
FixedDiscountCouponDO fixedDiscount = (FixedDiscountCouponDO) template;
return BigDecimal.valueOf(fixedDiscount.getDiscountAmount());
}
}
满减
public class ThresholdCalculationStrategy implements CouponCalculationStrategy {
@Override
public BigDecimal calculateDiscount(CouponTemplateDO template, BigDecimal orderAmount) {
ThresholdCouponDO thresholdDiscount = (ThresholdCouponDO) template;
if (orderAmount.compareTo(BigDecimal.valueOf(thresholdDiscount.getThresholdAmount())) >= 0) {
return BigDecimal.valueOf(thresholdDiscount.getDiscountAmount());
}
return BigDecimal.ZERO;
}
}
工厂类
public class CouponFactory {
/**
* 获取优惠券计算策略。
*
* @param coupon 基础优惠券模板对象
* @return 对应的优惠券计算策略
*/
public static CouponCalculationStrategy getCouponCalculationStrategy(CouponTemplateDO coupon) {
switch (DiscountTypeEnum.getByType(coupon.getType())) {
case FIXED_DISCOUNT:
return new FixedDiscountCalculationStrategy();
case THRESHOLD_DISCOUNT:
return new ThresholdCalculationStrategy();
case DISCOUNT_COUPON:
return new DiscountCalculationStrategy();
default:
throw new IllegalArgumentException("Invalid coupon type");
}
}
}
环境类
@Service
public class CouponCalculationService {
/**
* 计算优惠金额。
* 根据传入的优惠券实例和订单金额,选择相应的计算策略,返回最终的优惠金额。
*
* @param coupon 具体的优惠券实例
* @param orderAmount 订单金额
* @return 计算出的优惠金额
*/
public BigDecimal calculateDiscount(CouponTemplateDO coupon, BigDecimal orderAmount) {
CouponCalculationStrategy strategy = CouponFactory.getCouponCalculationStrategy(coupon);
return strategy.calculateDiscount(coupon, orderAmount);
}
}
总结
策略模式通过定义一系列可互换的算法,并将它们封装到独立的策略类中,使得算法可以在运行时动态替换,提供了更灵活和可扩展的设计方案。策略模式有效地消除了算法的条件分支语句,使代码更加简洁和清晰。
标签:return,策略,public,算法,orderAmount,搞懂,设计模式,BigDecimal,一文 From: https://blog.csdn.net/qq_62095670/article/details/143117692