多态可避免电商优惠券计算中大量if-else,通过统一接口discountstrategy定义calculate方法,各具体策略类(如fixeddiscount、thresholdreduction)独立实现,运行时按type动态绑定,新增类型只需添加实现类并注册,支持组合扩展。

在电商优惠券计算中,用多态可以避免大量 if-else 判断,让满减、折扣等不同优惠类型各自实现自己的计算逻辑,调用时只需面向父类或接口操作,运行时自动绑定具体行为。
定义统一优惠策略接口
先抽象出优惠券的核心能力:给定订单金额,返回实际应付金额。不关心是满减还是打几折,只约定“怎么算”。
- 定义接口 DiscountStrategy,声明方法 calculate(double originalAmount)
- 所有优惠类型(如满300减50、85折、阶梯满减)都实现该接口
- 这样上层代码(比如结算服务)只依赖接口,不耦合具体实现
为不同优惠类型提供具体实现
每个子类专注自己规则,互不影响,新增优惠类型也不改老代码。
- FixedDiscount(固定折扣):输入原价,返回 originalAmount * 0.85
- ThresholdReduction(满减):检查是否达门槛,如 originalAmount >= 300 ? originalAmount - 50 : originalAmount
- StepDiscount(阶梯满减):用 if-else 或 Map 匹配区间,返回对应减免后金额
运行时动态选择策略
优惠券数据里通常带 type 字段(如 "FIXED_DISCOUNT", "THRESHOLD_REDUCTION"),可结合工厂或策略映射表创建对应对象。
- 用 Map
预加载所有策略实例,key 是优惠类型标识 - 结算时根据优惠券 type 查出对应策略对象,直接调用 calculate(orderAmount)
- 即使未来加“买赠”“积分抵扣”,也只需新增实现类 + 注册到 map,不改结算主流程
组合与扩展更灵活
真实场景常需叠加多种优惠(如先打折再满减),多态天然支持装饰器或组合模式。
- 定义 CompositeStrategy 实现同一接口,内部持有一组策略,按顺序调用
- 例如:new CompositeStrategy(discountStrategy, reductionStrategy).calculate(1000)
- 各策略仍独立维护,组合逻辑清晰,调试和单元测试也容易隔离
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











