策略模式核心是“一个接口+多个实现类+上下文持接口引用”,通过解耦行为实现开闭原则,新增策略只需加类不改旧代码,纯jdk即可实现。

Java 基础中用接口实现策略模式,关键是靠“一个接口 + 多个实现类 + 上下文持有接口引用”这三要素完成行为解耦。它不依赖 Spring、泛型或高级语法,纯 JDK 就能跑通,核心目标是把 if-else 拆掉,让新增逻辑只需加类,不改老代码。
定义统一策略接口
接口只声明“做什么”,不暴露“怎么做”或业务细节。方法签名要稳定,避免后续改动导致所有实现类报错。
- 用上下文对象(如 PaymentContext)统一封装参数,而不是写
pay(String channel, BigDecimal amount) - 方法返回值按需设计:简单场景用
void或boolean;需要结果时明确返回类型(如Result) - 不要在接口里加判断逻辑,比如
isSupport(String type)—— 这属于策略内部职责
编写多个具体策略类
每个类实现同一接口,各自封装一种算法或行为。它们彼此独立,互不影响。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如支付场景:WechatPayStrategy、AlipayStrategy、CardPayStrategy 都实现 PaymentStrategy
- 每个类只专注一件事,方法体尽量控制在 15–20 行内
- 避免在策略类里再嵌套 if-else —— 如果出现,说明策略粒度太粗,该进一步拆分
用上下文类封装调用逻辑
上下文不关心具体是哪个策略,只面向接口编程。它负责接收策略、传入上下文数据、触发执行。
- 通过构造器或 setter 注入策略实例,便于测试和替换
- 提供统一入口方法(如
process(PaymentContext context)),内部直接调用strategy.execute(context) - 不硬编码策略选择逻辑,也不维护 Map 或 switch —— 选择权交给调用方
客户端按需切换策略
谁用谁选。运行时根据业务条件 new 出对应策略,传给上下文即可。
- 比如根据请求中的 channel 字段决定用哪个策略:
if ("wechat".equals(ctx.getChannel())) { context.setStrategy(new WechatPayStrategy()); } - 也可以配合简单工厂封装选择逻辑,但工厂本身不承担策略实现,只做 new 和返回
- 这种写法适合小项目或教学演示,清晰直观,不引入额外框架
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










