在我们日常开发中,难免会和第三方接口进行教会。拿支付来举例,我们现在的平台是使用建行支付的,但随着业务的扩增,又引入了招行支付和通联支付。在编写代码的时候,总不能增加一个三方支付就去修改自己业务实现,为此,使用策略模式设计此接口。详见代码。
支付类型枚举
package cn.zxw.strategy;
/**
* @author 华安小书童
* @description 支付类型
* @data: 2022/01/14 20:42
*/
public enum PayType {
/**
* 微信支付
*/
WE_CHAT("WE_CHAT", "微信支付"),
/**
* 支付宝支付
*/
ZFB("ZFB", "支付宝支付"),
/**
* 银联支付
*/
UNION_PAY("UNION_PAY", "银联支付");
/**
* 支付名称
*/
public final String name;
/**
* 支付描述
*/
public final String desc;
PayType(String name, String desc) {
this.name = name;
this.desc = desc;
}
}
三方支付构建类
package cn.zxw.strategy;
import cn.hutool.extra.spring.SpringUtil;
import cn.zxw.strategy.third_impl.UnionPayServiceImpl;
import cn.zxw.strategy.third_impl.WeChatPayServiceImpl;
import cn.zxw.strategy.third_impl.ZhiFuBaoServiceImpl;
import lombok.AllArgsConstructor;
import java.util.HashMap;
import java.util.Map;
/**
* @author 华安小书童
* @description 初始化三方服务
* @data: 2022/01/14 20:42
*/
@AllArgsConstructor
public class ThirdServiceBuilder {
private final static Map<String, IThirdPayService> THIRD_PAY_POOL = new HashMap<>(3);
static {
THIRD_PAY_POOL.put(PayType.WE_CHAT.name, SpringUtil.getBean(WeChatPayServiceImpl.class));
THIRD_PAY_POOL.put(PayType.ZFB.name, SpringUtil.getBean(ZhiFuBaoServiceImpl.class));
THIRD_PAY_POOL.put(PayType.UNION_PAY.name, SpringUtil.getBean(UnionPayServiceImpl.class));
}
public static IThirdPayService getThirdPay(String name) {
return THIRD_PAY_POOL.get(name);
}
}
己方支付控制器
package cn.zxw.strategy;
import cn.zxw.strategy.service.IPayService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 华安小书童
* @description 支付控制器
* @data: 2022/01/14 20:42
*/
@RestController
@AllArgsConstructor
public class PayController {
private final IPayService payService;
@GetMapping("/test")
public String test(@RequestParam String name, @RequestParam Integer money) {
return payService.pay(name, money);
}
}
己方支付接口
package cn.zxw.strategy.service;
/**
* @author 华安小书童
* @description 支付接口
* @data: 2022/01/14 20:42
*/
public interface IPayService {
/**
* 具体支付实现
*
* @param type 选择哪个第三方进行支付
* @param money 金额
* @return
*/
String pay(String type, Integer money);
}
己方支付接口实现
package cn.zxw.strategy.service;
import cn.zxw.strategy.IThirdPayService;
import cn.zxw.strategy.ThirdServiceBuilder;
import org.springframework.stereotype.Service;
/**
* @author 华安小书童
* @description 支付实现类
* @data: 2022/01/14 20:42
*/
@Service
public class PayServiceImpl implements IPayService {
@Override
public String pay(String type, Integer money) {
System.out.println("进行支付操作逻辑");
IThirdPayService thirdPayService = ThirdServiceBuilder.getThirdPay(type);
thirdPayService.pay(money);
return "success";
}
}
三方支付接口 (引入的第三方接口都要实现此接口)
package cn.zxw.strategy;
/**
* @author By: zhangxiongwei
* Package cn.zxw.strategy
* Ceate Time 2022-01-14 15:06
* Copyright 2021 www.jilianjituan.com Inc. All rights reserved.
* 注意:本内容仅限于冀联人力集团内部传阅,禁止外泄以及用于其他的商业目的
*/
public interface IThirdPayService {
/**
* 支付
* @param money 金额
* @return {string}
*/
String pay(Integer money);
}
微信支付实现
package cn.zxw.strategy.third_impl;
import cn.zxw.strategy.IThirdPayService;
import org.springframework.stereotype.Component;
/**
* @author 华安小书童
* @description 微信支付具体实现
* @data: 2022/01/14 20:42
*/
@Component
public class WeChatPayServiceImpl implements IThirdPayService {
@Override
public String pay(Integer money) {
System.out.println("WeChat pay " + money);
return "success";
}
}
##### 支付宝支付实现
package cn.zxw.strategy.third_impl;
import cn.zxw.strategy.IThirdPayService;
import org.springframework.stereotype.Component;
/**
* @author 华安小书童
* @description 支付宝支付具体支付
* @data: 2022/01/14 20:42
*/
@Component
public class ZhiFuBaoServiceImpl implements IThirdPayService {
@Override
public String pay(Integer money) {
System.out.println("ZhiFuBao pay " + money);
return "success";
}
}
至此代码准备完毕,我们进行测试
GET http://localhost:6003/test/?name=ZFB&money=1223
输出信息
GET http://localhost:6003/test/?name=ZFB&money=1223
输出信息