1.创建一个枚举 定义需要实现的支付类型
public enum PayEnum {
zfb_pay("0","支付宝支付"),
wx_pay("1","微信支付"),
other_pay("2","其他支付"),
;
private String code;
private String desc;
PayEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public static PayEnum getCode(String code) {
PayEnum[] values = PayEnum.values();
List<PayEnum> collect = Arrays.stream(values).filter(payEnum -> payEnum.code.equals(code)).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(collect)){
return collect.get(0);
}
return PayEnum.other_pay;
}
}
2.定义工厂模型 将所有的实现类 都交给工厂方式去调用
@Component
public class PayFactoryImpl implements InitializingBean {
/**
* @Description
* InitializingBean描述:是Spring提供的拓展性接口,InitializingBean接口为bean提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法
* 类职责描述:
工厂类实现InitializingBean方式 在springboot 启动之后将支付实现类都注入对应
payServiceMap 中,控制层根据code 获取对应实现类
* 优点 : 实现类的单一指责性 增加代码可视性 以及扩展性
*/
@Resource
private List<PayService> payServicesList;
private Map<PayEnum,PayService> payServiceMap = new HashMap<>();
public PayService getPayServiceByCode(String code){
PayEnum payEnum = PayEnum.getCode(code);
return payServiceMap.get(payEnum);
}
@Override
public void afterPropertiesSet() {
for (PayService payService : payServicesList) {
payServiceMap.put(payService.payenum(),payService);
}
}
}
3.定义接口以及实现类
public interface PayService {
PayEnum payenum();
R pay();
R findPay();
}
@Service
public class ZfbPaySercieImpl implements PayService {
@Override
public PayEnum payenum() {
//根据支付枚举 确定要调用的实现类
return PayEnum.zfb_pay;
}
@Override
public R pay() {
System.out.println("支付宝支付");
return R.ok();
}
@Override
public R findPay() {
System.out.println("支付宝支付 查询");
return R.ok();
}
}
@Service
public class WxPaySercieImpl implements PayService {
@Override
public PayEnum payenum() {
//根据支付枚举 确定要调用的实现类
return PayEnum.wx_pay;
}
@Override
public R pay() {
System.out.println("微信支付");
return R.ok();
}
@Override
public R findPay() {
System.out.println("weixin支付 查询");
return R.ok();
}
}
4.测试示例
@RestController
@RequestMapping("/test")
public class TestWeb {
@Resource
private PayFactoryImpl payFactory;
@GetMapping("/test1")
public R test() {
R pay = payFactory.getPayServiceByCode("1").pay();
System.out.println(pay);
R pay1 = payFactory.getPayServiceByCode("1").findPay();
System.out.println("pay1 = " + pay1);
return R.ok();
}
}
输出结果:
微信支付
{code=200, message=操作成功}
weixin支付 查询
pay1 = {code=200, message=操作成功}
注意:InitializingBean 是springboot启动后才执行的 新增方式需要重启应用 否则spring无法注入