之前做支付的时候,涉及到微信支付,支付宝支付,而在用微信支付的过程中,又用到了app支付和小程序支付.其实,在支付宝中,也分为网页支付,app支付等等.在开发时候都是做if else 判断.写得多了,就感觉很乱,现在不断的学习中,感觉这种用策略模式很好用,这里也就做个记录,同时分享下.
写个简单demo,这里使用springboot开发.
控制类
@RestController
public class PayController {
@Autowired
private PayService payService;
@RequestMapping("pay")
public String getResult(PayDto payDto) {
return payService.getResult(payDto);
}
}
然后定义个接口并且实现它
@Service
public class PayServiceImpl implements PayService {
// 定义一个map,存放所有Pay的实现类,根据key值取得相应的实现类
private Map<String, Pay> map = new HashMap<String, Pay>();
public PayServiceImpl(List<Pay> payList) {
for (int i = 0; i < payList.size(); i++) {
Pay pay = payList.get(i);
map.put(pay.getWay() + pay.getType(), pay);
}
}
public String getResult(PayDto payDto) {
Pay pay = map.get(payDto.getWay() + payDto.getType());
Map<String, String> data = new HashMap<>();
// data.put("money", "100");
// data.put("orderNo", "123456789");
/************ 省略其他代码 *************/
Map<String, String> reqData = pay.getReqData(data);
Map<String, String> result = pay.getResult(reqData);
return "发起支付成功";
}
}
这里的Pay是一个接口,可以有各种实现,微信支付 支付宝支付等等
public interface Pay {
// 得到支付方式
String getWay();
// 得到支付类型
String getType();
// 统一下单封装请求数据
Map<String, String> getReqData(Map<String, String> map);
// 得到下单结果
Map<String, String> getResult(Map<String, String> reqData);
}
各种实现方式实现它的接口,而且在微信支付 支付宝支付又分了各种支付,分别创建WxPay AliPay来实现它,而对应的支付方式再继承他们,重写不一致的方法即可,当然,你也可以全部分开实现它
@Component
public class WxPay implements Pay{
public String getWay() {
// TODO Auto-generated method stub
return "wx";
}
/* (non-Javadoc)
* @see com.yp.pay.Pay#getType()
*/
public String getType() {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see com.yp.pay.Pay#getReqData(java.util.Map)
*/
public Map<String, String> getReqData(Map<String, String> map) {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see com.yp.pay.Pay#getResult(java.util.Map)
*/
public Map<String, String> getResult(Map<String, String> reqData) {
// TODO Auto-generated method stub
return null;
}
}
以下是微信支付的各种实现,各自完成它即可
public class WxAppPay extends WxPay{
/* (non-Javadoc)
* @see com.yp.pay.Pay#getType()
*/
public String getType() {
// TODO Auto-generated method stub
return “app”;
}
public Map<String, String> getReqData(Map<String, String> map) {
System.out.println("微信app支付封装数据");
return null;
}
/* (non-Javadoc)
* @see com.yp.pay.Pay#getResult(java.util.Map)
*/
public Map<String, String> getResult(Map<String, String> reqData) {
System.out.println("微信app支付返回数据");
return null;
}
}
支付宝的原理是一样的 ,这里就不贴出来了,那么我们通过接口来看下结果,我这里定义的是80端口
借宿