用多态替代条件分支实现可扩展折扣逻辑:定义discountpolicy接口及各等级实现类,通过工厂或映射表解耦等级与策略,会员实体持策略引用并直接调用,符合开闭原则。

用多态替代条件分支,让折扣逻辑可扩展
传统商场会员折扣工具常靠 if-else 或 switch 判断会员等级(如普通、白银、黄金、钻石),再硬编码对应折扣率。这种写法导致每新增一个等级,就要改主计算逻辑,违反开闭原则。
面向对象的解法是:把“不同等级如何算折扣”这个行为,**上移到各自等级类中实现**。主流程只负责调用统一接口,不关心具体怎么算——这就是多态的核心价值。
定义统一 DiscountPolicy 接口,封装折扣行为
先抽象出一个策略接口(或抽象类),比如:
interface DiscountPolicy {
double apply(double originalPrice, int purchaseCount);
}
每个会员等级对应一个实现类:SilverPolicy、GoldPolicy、DiamondPolicy……它们各自重写 apply 方法,处理本等级特有的规则(如阶梯满减、叠加积分、限时加成等)。
这样,折扣逻辑彻底解耦,新增等级只需新增类,不碰原有代码。
用工厂或策略映射表解耦会员类型与策略实例
运行时根据用户等级拿到对应策略对象,推荐两种轻量方式:
-
Map 映射:初始化时构建
Map<memberlevel discountpolicy></memberlevel>,查表获取策略,简单直接; - 简单工厂:传入等级枚举,返回对应策略实例,便于加入初始化逻辑(如加载配置、校验有效性);
避免在业务方法里 new 具体策略类,否则又会散落耦合点。
让会员实体持有策略,自然体现“对象行为”
会员对象(Member)不只存等级字段,更应持有一个 DiscountPolicy 引用:
class Member {
private final MemberLevel level;
private final DiscountPolicy policy;
// 构造时注入对应策略
}
结算时直接调用 member.getPolicy().apply(price, count)。逻辑归属清晰,测试也容易——给定某个会员,就能精准验证其折扣行为,无需模拟整个 if 链。











