策略模式通过提取分支逻辑为独立策略类,消除冗长if-else;定义统一接口(如messagestrategy),各渠道策略(sms/email/wecom)解耦实现;借助spring自动装配map实现零if-else路由。

策略模式通过将不同分支逻辑抽离成独立的策略类,让原本集中在一处的 if-else 或 switch-case 消失,转而由上下文(Context)委托给具体策略执行。核心不是“去掉判断”,而是把判断从业务主干中移出,交由更灵活、可插拔的方式管理。
定义统一策略接口
所有分支行为必须遵循同一契约。例如消息发送场景中,无论短信、邮件还是企微,都应实现一个 MessageStrategy 接口:
- 声明公共方法如 send(MessageRequest request) 和 record(MessageRecord record)
- 不暴露实现细节,比如 Token 获取、附件解析、签名逻辑等,只暴露调用入口
- 接口越精简越稳定,避免频繁修改导致所有策略类连锁变更
为每种分支创建具体策略类
每个条件分支对应一个实现类,彼此完全解耦:
- SmsMessageStrategy:专注构建短信内容、调用网关、处理失败重试
- EmailMessageStrategy:负责 HTML 渲染、附件加载、编码适配
- WeComMessageStrategy:封装用户 ID 映射、机器人 token 管理、消息格式转换
- 新增渠道(如飞书、AppPush)只需新增类,不碰原有代码
用 Spring 自动装配替代硬编码判断
不再写 "SMS".equals(channelType) 这类字符串匹配,而是利用 Spring 的 Bean 名称或注解自动注册与查找:
- 给每个策略类加上 @Component("smsStrategy")、@Component("emailStrategy") 等限定名
- 在上下文类中注入 Map
,key 为渠道类型(如 "SMS"),value 为对应 Bean - 运行时直接 strategies.get(request.getChannelType()).send(request),零 if-else
- 若渠道不存在,抛异常或走默认策略,逻辑清晰可控
保留必要判断但大幅简化
策略模式不追求彻底消灭判断,而是让判断变得轻量、集中、易维护:
- 真正的业务判断仍存在,比如校验参数、幂等性检查、限流判断——这些保留在上下文或拦截器中
- 原来嵌套在 if 块里的 50 行发送逻辑 + 30 行记录逻辑,现在被拆成两个职责分明的方法,在各自策略类里实现
- 单元测试也从“覆盖 N 个 if 分支”变成“对每个策略类单独测 send() 和 record()”,覆盖率和可读性同步提升
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











