多态使电商促销系统通过统一Coupon接口实现不同优惠券的抵扣逻辑,无需if-else判断类型;各子类(满减、折扣、无门槛、阶梯券)独立实现calculateDiscount方法,结算服务面向接口编程,新增券类型只需添加实现类,原有代码零修改。

在电商促销系统中,多态能让你用同一个方法调用(比如 calculateDiscount(order)),自动执行不同优惠券(满减券、折扣券、无门槛券、阶梯券)各自的抵扣逻辑,无需 if-else 判断券类型,代码更易扩展、可读性更强、维护成本更低。
定义统一的优惠券行为接口
核心是抽象出「计算抵扣金额」这一共同能力。不关心具体怎么算,只约定每个券都必须提供这个能力:
public interface Coupon {
// 给定订单,返回本次能抵扣多少钱
BigDecimal calculateDiscount(Order order);
}
所有具体优惠券都实现它,各自封装自己的业务规则。
为每类优惠券编写独立实现类
每个子类只专注自身逻辑,互不影响。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 满减券(如满300减50):先判断订单实付金额是否达标,达标则返回固定减额,否则返回 0。
-
折扣券(如85折):用订单原价 × (1 − 折扣率),注意保留精度、避免浮点误差,推荐用
BigDecimal运算。 - 无门槛券(如10元无门槛):直接返回面值,但需校验是否过期、是否已使用、是否限品类等前置条件。
- 阶梯满减券(如满200减20,满500减80):按订单金额落入的最高档位返回对应减免额,可用 TreeMap 或 if-else 链实现区间匹配。
在结算服务中面向接口编程
结算时只持有 Coupon 接口引用,完全不知道也不需要知道背后是哪种券:
public class SettlementService {
public BigDecimal applyCoupon(Order order, Coupon coupon) {
// 一行代码,自动调用对应子类的 calculateDiscount
return coupon.calculateDiscount(order);
}
}
新增一种「买赠券」?只需新增一个 BuyGiftCoupon implements Coupon 类,写好自己的 calculateDiscount,原有结算逻辑一丁点都不用改。
配合策略模式提升灵活性(进阶建议)
如果同一用户可能叠加多张券,或需按优先级/互斥规则选择最优券,可把多态 + 策略模式结合:用 CouponStrategy 封装「选券 + 计算」整套流程,再通过工厂或配置动态加载策略。这样连「用哪张券」的决策逻辑也解耦了。

















