微信支付,支付宝支付使用策略模式,让程序更好维护

      之前做支付的时候,涉及到微信支付,支付宝支付,而在用微信支付的过程中,又用到了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端口
微信支付

在这里插入图片描述

借宿

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值