面向对象行为模式通过策略模式解耦类型判断、条件路由与行为执行,配合工厂、接口抽象和配置驱动消除硬编码分支;识别三类重构信号:业务规则频繁调整、多套逻辑并存、判断依据来自外部;策略接口应轻量专注、参数领域化、命名具业务语义、含selfdescribe()元信息;“选哪个”由工厂或上下文负责,“怎么执行”由策略实现;配套降级、监控、类加载隔离及规则引擎兜底,实现新增策略零修改主流程。

用面向对象的行为模式消灭硬编码分支判断,核心不是“多写几个类”,而是把变化点从主干逻辑里摘出来,让类型判断、条件路由、行为执行三者解耦。策略模式是最直接有效的手段,配合工厂、接口抽象和配置驱动,就能让 if-else 和 switch 彻底退出业务核心。
识别该抽成策略的典型信号
不是所有分支都值得策略化。重点关注三类场景:
- 业务规则频繁调整,比如优惠计算方式每月一换、风控阈值按城市动态配置
- 多套逻辑并存,例如新老订单履约路径共跑、AB 测试中的双版本路由
- 判断依据来自外部,如扫码内容含 "WeChat" / "Alipay" / "Unicom",或错误类型是 RetryableError、RejectedError、FailedError
一旦发现代码里反复出现 switch(code)、if(type.equals("X")) 或 instanceof XxxError,就是明确的重构信号。
定义轻量、专注、可描述的策略接口
接口不是容器,只表达“做什么”,不掺杂“怎么做”之外的职责:
- 方法参数用领域对象(如 Order、RiskContext),别传一堆 String、int、boolean
- 返回值类型具体明确,避免 Object 或泛型擦除后强转
- 每个策略类只做一件事:比如 SummerPromotionStrategy 算折扣,VipTier2DiscountStrategy 算会员价,命名自带业务语义
- 加一个 selfDescribe() 方法,返回适用条件、版本、作者等元信息,方便运维查策略、灰度切流
把“选哪个”和“怎么执行”彻底分开
策略对象本身不决定自己是否被调用——那是上下文或工厂的事:
- 判断条件(用户等级、地域编码、订单金额区间)统一由调用方提取,作为参数传入策略,策略内部不查数据库、不读配置
- 用策略工厂封装创建逻辑,支持按 key 获取、按标签筛选、按权重路由;工厂可监听 Apollo/Nacos 配置变更,实时刷新生效策略
- 避免策略间互相调用或持有 Spring Bean 引用;共享逻辑(如通用日志、幂等校验)抽成独立服务,通过构造器注入
配套能力让策略真正落地可用
光有策略类只是第一步。生产环境需要:
- 降级机制:当指定策略加载失败或执行超时,自动 fallback 到默认策略
- 监控埋点:记录各策略调用量、耗时、异常率,快速定位劣质策略
- 类加载隔离:对需热更新的临时活动规则,用自定义 ClassLoader 加载 jar,避免重启
- 规则引擎兜底:复杂组合条件(如“北京+VIP+订单>500”)可交由 Drools 或 Easy Rules 处理,策略负责执行结果
这样,新增一种支付渠道、一类错误响应、一个城市风控策略,只需写一个实现类 + 配置中心注册,主流程代码零修改。











