Java策略模式以窄口径接口为核心,Context持接口引用并支持运行时切换,各实现类专注单一职责、无状态,通过Spring或工厂管理实例避免硬编码。

Java 中接口是策略模式落地的关键,它让算法切换不依赖代码修改,只靠替换实现类实例就能生效。
用窄口径接口定义统一契约
接口要小而专,只暴露必要方法,比如支付策略就定义 pay(double amount) 和 getPaymentName() 两个方法。不加日志、不传上下文、不塞配置参数——那些该由外部注入或在构造时固化。方法签名一旦定下,所有实现类必须严格遵守,否则运行时调用会出错。
上下文只持接口引用,不认具体类型
Context 类里声明字段为接口类型,例如:
private PaymentStrategy strategy;
提供 setStrategy(PaymentStrategy s) 方法支持运行时赋值。执行逻辑时直接调用 strategy.pay(amount),完全不感知背后是支付宝还是微信。切换策略只需一行赋值,无需改 Context 任何一行逻辑。
策略实现类各自独立,互不影响
- 每个实现类专注一件事:AlipayStrategy 只处理支付宝签名与回调,WechatStrategy 只管微信 JSAPI 参数组装
- 构造函数接收必要配置(如 appid、私钥),创建后实例应尽量无状态
- 禁止在 pay() 方法里做 HTTP 调用或数据库操作——那是服务层的事,策略只负责“怎么算、怎么组参”
- 新增一种支付方式?写个新类实现接口,其他地方不用动
结合 Spring 或工厂管理实例,避免硬编码 new
不要在业务代码里写 new AlipayStrategy()。推荐两种方式:
- Spring 中用 @Qualifier("alipay") 注入指定 Bean,或通过配置中心读取策略名,用 applicationContext.getBean(name, PaymentStrategy.class) 获取
- 自建工厂类,用 Map


















