java中用多态实现优惠券计算的核心是定义统一接口couponcalculator,各券型(满减、折扣、无门槛、阶梯)分别实现calculate方法;业务层面向接口调用,结合工厂或spring策略模式,新增券型无需修改原有代码,符合开闭原则。

在 Java 中,用多态实现多种活动优惠券计算,核心是**定义统一的计算接口或抽象类,让每种优惠券(如满减券、折扣券、无门槛券、阶梯折扣券)各自实现自己的计算逻辑**。这样业务层只需面向接口编程,无需关心具体类型,新增优惠券类型也不用修改原有代码,符合开闭原则。
定义优惠券计算的统一契约
推荐使用抽象类或接口。接口更轻量,适合纯行为抽象;抽象类可提供部分通用逻辑(比如校验金额是否合法)。这里以接口为例:
public interface CouponCalculator {
/**
* 计算优惠后应付金额
* @param originalPrice 原价(单位:分,避免浮点误差)
* @return 优惠后应付金额(单位:分)
*/
int calculate(int originalPrice);
}为不同活动优惠券实现具体计算逻辑
每种优惠券实现 CouponCalculator,封装自身规则:
-
满100减20券:
if (originalPrice >= 10000) return originalPrice - 2000;否则不减 -
85折券:
return (int) Math.floor(originalPrice * 0.85);(注意向下取整,单位为分) -
无门槛5元券:
return Math.max(0, originalPrice - 500);(防负数) - 阶梯满减(满200减30,满500减100):按最高档匹配,用 if-else 或 Map 查表
运行时动态选择并调用
业务中根据订单或用户领取的优惠券类型,创建对应实例(可通过工厂、策略映射或 Spring Bean 名称注入):
// 示例:简单工厂
public class CouponFactory {
public static CouponCalculator getCalculator(String type) {
return switch (type) {
case "FULL_REDUCTION" -> new FullReductionCoupon(10000, 2000);
case "DISCOUNT" -> new DiscountCoupon(0.85);
case "NO_THRESHOLD" -> new NoThresholdCoupon(500);
default -> throw new IllegalArgumentException("Unknown coupon type");
};
}
}
<p>// 使用时
CouponCalculator calc = CouponFactory.getCalculator(order.getCouponType());
int finalPrice = calc.calculate(order.getAmountInCents());</p>进阶建议:结合策略模式 + Spring 管理
在 Spring 项目中,可将各类 CouponCalculator 实现类打上 @Component,用 @Qualifier 或基于类型/名称自动装配;再配合 Map<string couponcalculator></string> 注入,彻底消除 if-else 分支,做到“加一种券,只加一个类,不改一行已有代码”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











