简介
说明
本文介绍Java中策略模式的写法:注入接口。
注入接口的具体方法是:接口+不同的实现类(作为Bean注册到Spring),注入接口来获取所有的实现类(是以Map的形式注入的,key为bean的名字,value为接口),然后通过key来获取对应的实现类的接口。
此写法的优缺点
优点
- 实现类是通过SpringBoot注入的,新增实现类时无需手动添加到策略集合。
- 较为简洁。
此写法的缺点
- 通过@Component的value来区分类型
- 只支持字符串,无法支持枚举。
- 需要很小心地维护实现类的value,防止重名。
- 实现类不显式持有类型,无法获得本类型的信息(比如:描述),只能手动指定。
实战
思路
- 提供一个支付功能接口类,不同的支付方式去实现这个抽象类。
- 实现类的@Component注解的value对应不同的类型。
- 通过注入这个接口类来获取实现类的集合(Map形式),key为实现类的@Component的value字段的值,通过它获取具体实现类,去调用支付的方法。
代码结构
代码
此内容仅限VIP查看,请先登录
测试
代码
package com.knife.example.controller; import com.knife.example.pay.PayType; import com.knife.example.pay.PayStrategyHolder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class PayController { @Autowired private PayStrategyHolder payStrategyHolder; @GetMapping("/pay") public String pay(PayType payType) { payStrategyHolder.pay(payType); return "test success"; } }
测试
访问:http://localhost:8080/pay?payType=WECHAT_PAY
后端结果
输出如下内容:
调用远程接口:微信支付
请先
!