java中多态实现商品折扣策略的核心是将折扣计算行为抽象为接口,由不同策略类实现具体逻辑,运行时通过策略对象动态决定行为。定义discountstrategy接口统一calculate方法,fixedamountdiscount、percentagediscount等类各自实现差异化算法;商品类持策略引用并注入,调用时自动适配;配合工厂或map映射实现配置化切换,新增策略无需修改旧代码。

在 Java 中,用多态实现商品折扣策略的核心是:**把“怎么算折扣”这个行为抽象出来,让不同策略自己决定,调用时无需关心具体类型**。关键不在于写多少类,而在于让计算逻辑可插拔、易扩展、不改旧代码。
定义统一的折扣策略接口
先声明一个 DiscountStrategy 接口,只暴露一个方法:
- double calculate(double originalPrice):输入原价,返回折后价(或直接返回折扣额,按需设计)
接口不关心谁来实现、何时用,只约定“必须能算”。这是多态的起点——编译期只知道接口,运行期才确定具体行为。
为不同场景编写具体策略类
每个策略是一个独立类,实现同一接口,但内部逻辑完全不同:
- FixedAmountDiscount:满 100 减 20,return Math.max(0, originalPrice - 20);
- PercentageDiscount:打 85 折,return originalPrice * 0.85;
- ThresholdDiscount:满 200 打 7 折,否则不打折,return originalPrice >= 200 ? originalPrice * 0.7 : originalPrice;
- SeasonalDiscount:根据当前月份动态调整(比如 12 月额外加 5%),return originalPrice * getRateByMonth(LocalDateTime.now().getMonth());
这些类彼此无关,新增一种折扣(如会员专属券)只需加个新类,不碰已有代码。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
在商品或订单中持有策略引用,运行时注入
不要在商品类里写 if-else 判断该用哪个折扣。而是让它持有一个 DiscountStrategy 类型的字段:
- 构造时传入(推荐):new Product("iPhone", 6999.0, new PercentageDiscount())
- 或 setter 注入:product.setDiscountStrategy(new ThresholdDiscount())
- 计算时统一调用:double finalPrice = product.getDiscountStrategy().calculate(product.getPrice());
同一个商品实例,换不同策略对象,结果就自动变化——行为由对象决定,不是由 if 分支决定。
配合工厂或策略映射表,实现运行时动态选择
实际业务中,折扣常由用户等级、活动配置、商品分类等决定。可以用简单工厂或 Map 管理:
- 维护 Map
,key 是策略编码(如 "VIP_95"、"FLASH_SALE") - 下单时根据上下文查出 key,再从 Map 拿对应策略对象
- 甚至可从数据库读取策略配置,反射创建实例(进阶,注意安全与性能)
这样,策略切换变成配置问题,而非改 Java 代码。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










