策略模式解耦计费逻辑,主流程只调用统一接口,新增计费方式无需修改原有代码;通过注解驱动的策略工厂自动路由,配合标准化输入输出与兜底降级,实现高可扩展性与稳定性。

直接用策略模式把计费逻辑抽出来,主流程只管“要算多少钱”,不管“怎么算”。关键不是写多少个类,而是让新增一种计费方式时,不碰原有代码、不改主流程、不加 if-else。
定义统一的计费行为契约
先定一个干净接口,只暴露业务语义,不塞实现细节:
- 输入参数聚焦真实业务字段:比如 orderAmount、userLevel、isFirstOrder、deliveryType,而不是传一堆 flag 或 strategyCode
- 输出结构标准化:统一返回 ChargeResult,含 finalAmount、appliedRules、breakdown(明细)等字段,下游不用 switch 类型解析
- 接口里不写任何判断逻辑:禁止出现 if (userLevel == VIP) {...} 这类代码,那是策略实现的事
按场景划分具体策略类
每种计费方式封装成独立类,只做一件事:
- VipDiscountStrategy:处理 VIP 用户满减+折上折
- NewUserFreeShippingStrategy:新客首单免运费逻辑
- SeckillSurchargeStrategy:大促秒杀订单加收服务费
- 每个类实现同一接口 ChargeStrategy,只重写 calculate(ChargeRequest) 方法
- 类内不依赖其他策略,不访问 Controller 或 Service 层上下文,只靠入参和内部规则计算
用策略工厂自动路由到对应实现
把“选哪个策略”这件事从主流程剥离,交给工厂组件:
- 所有策略类标注注解,例如 @Supports(scene = "new_user", priority = 20)
- 工厂启动时扫描这些 Bean,按 scene + priority 建立映射表,支持运行时刷新(比如从 Nacos 配置中心更新权重)
- 主业务中只需一行:strategyFactory.get(scene).calculate(request),scene 可来自订单类型、用户标签或活动配置
- 没有匹配策略时,自动 fallback 到 DefaultFlatRateStrategy,保障基本可用性
在调用层做轻量适配与兜底
Controller 或对外 OpenAPI 层保持极简:
- 只做参数校验、组装 ChargeRequest、调用策略门面、包装 ChargeResult
- 不捕获策略内部异常,统一由全局异常处理器转为标准错误码,如 CHARGE_STRATEGY_UNAVAILABLE
- 对超时、空结果等场景内置降级逻辑,比如降级为按基础费率计费,避免整个下单链路失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











