策略模式之聚合支付业务的枚举实现

目录

背景

实现

总结


背景

如图用户在前端页面点击支付渠道的图标,来拉取不同渠道厂商接口完成相应的支付:

实现

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()进行抽取为简单工厂类,通过工厂模式获取对应策略。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知始行末

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值