目录
背景
如图用户在前端页面点击支付渠道的图标,来拉取不同渠道厂商接口完成相应的支付:
实现
1.定义抽象支付接口,声明支付统一流程方法和支付个性化方法:
public interface Payment<T> {
/**
* 支付全流程
* @return
*/
T pay();
/**
* 获取支付参数
* @return
*/
T getPayParam();
/**
* 支付
* @param t
*/
T doPay(T t);
/**
* 解析支付结果
* @param t
* @return
*/
T getPayResult(T t);
}
2.定义支付的抽象类,采用模板模式统一同步支付主流程:
public abstract class AbstractPaymentPipeline<T> implements Payment<T> {
@Override
public T pay() {
T payParam = getPayParam();
T response = doPay(payParam);
return getPayResult(response);
}
}
3.个性化支付渠道对接,采用不同子类实现。定义阿里支付和微信支付类 ,包含各自的支付个性化参数封装、支付发起、支付回调结果解析。
public class AliPay<T> extends AbstractPaymentPipeline<T> {
@Override
public T getPayParam() {
//获取阿里支付参数
return null;
}
@Override
public T doPay(T t) {
//调用阿里接口支付
return null;
}
@Override
public T getPayResult(T t) {
//解析阿里支付记录
return null;
}
}
public class WechatPay<T> extends AbstractPaymentPipeline<T> {
@Override
public T getPayParam() {
//获取微信支付参数
return null;
}
@Override
public T doPay(T t) {
//调用微信接口支付
return null;
}
@Override
public T getPayResult(T t) {
//解析微信支付记录
return null;
}
}
4.定义枚举类枚举我们路由的渠道 key和渠道处理类,通过match()参数根据路由key匹配获取对应渠道枚举:
public enum PayStrategyEnum {
ALI_PAY("ALI", new AliPay()),
WECHAT_PAY("WECHAT", new WechatPay<>());
private String name;
private Payment payment;
PayStrategyEnum(String name, Payment payment) {
this.name = name;
this.payment = payment;
}
public String getName() {
return name;
}
public Payment getPayment() {
return payment;
}
public static PayStrategyEnum match(String name) {
PayStrategyEnum[] values = PayStrategyEnum.values();
for (PayStrategyEnum v: values) {
if (v.name.equals(name)) {
return v;
}
}
return null;
}
}
5.最后,根据前端渠道路由参数,获取实例处理参数完成处理:
public class PayClient {
public static void main(String[] args) {
String name = "WECHAT";
PayStrategyEnum payStrategyEnum = PayStrategyEnum.match(name);
Payment payment = payStrategyEnum.getPayment();
payment.pay();
}
}
总结
- 通过上述枚举方法避免了多余的if-else,并将获取策略封装到独立的类中,避免和其他业务逻辑耦合,符合单一职责原则。
- 后续如果接入新的渠道,可以不用修改原有的逻辑业务,只需增加对应的实现类和枚举值即可符合开闭原则。
- 枚举值过多不易维护时,可以将match()进行抽取为简单工厂类,通过工厂模式获取对应策略。