首先创建一个支付渠道的抽象类
package paymethod; /** * 支付通道 * @author lp */ public abstract class PayAccess { //支付类型的抽象方法 public abstract String getName(); //查询余额的抽象方法 protected abstract double queryBlance(String uid); //扣款支付 public MsqResult pay(String uid,double amount){ if(queryBlance(uid)<amount){ return new MsqResult(500,"支付失败","余额不足"); } return new MsqResult(200,"支付成功","支付金额:"+amount); } }
然后就是创建支付策略类
package paymethod; import java.util.HashMap; import java.util.Map; /** * 定义不同的支付策略 * @author lp */ public class PayStrategy { public static final String ZHIFUBAO_PAY="ZHIFUBAO"; public static final String WEIXIN_PAY="WEIXIN"; public static final String UNION_PAY="UNION"; public static final String DEFAULT_PAY=ZHIFUBAO_PAY; private static Map<String,PayAccess> payAccessMap=new HashMap<>(); static { payAccessMap.put(ZHIFUBAO_PAY,new ZhifuBao()); payAccessMap.put(WEIXIN_PAY,new Weixin()); payAccessMap.put(UNION_PAY,new Union()); } //通过key支进行匹配不同的支付 public static PayAccess get(String paykey){ if(!payAccessMap.containsKey(paykey)){ return payAccessMap.get(DEFAULT_PAY); } return payAccessMap.get(paykey); } }
接下来创建三种不同的支付方式:这里是支付宝,微信,银联
package paymethod; /** * 支付宝支付 * @author lp */ public class ZhifuBao extends PayAccess { @Override public String getName() { return "支付宝"; } @Override protected double queryBlance(String uid) { return 900; } }
package paymethod; /** * 微信支付 * @author lp */ public class Weixin extends PayAccess { @Override public String getName() { return "微信支付"; } @Override protected double queryBlance(String uid) { return 500; } }
package paymethod; /** * 银联支付 * @author lp */ public class Union extends PayAccess { @Override public String getName() { return "银联支付"; } @Override protected double queryBlance(String uid) { return 300; } }
然后再创建一个类,定义调用哪一种支付方式
package paymethod; /** * 定义支付方法调用 */ public class Order { private String uid; private String orderid; private double amount; public Order(String uid, String orderid, double amount) { this.uid = uid; this.orderid = orderid; this.amount = amount; } //默认使用一个支付方法,如果没有选择 public MsqResult pay(){ return pay(PayStrategy.DEFAULT_PAY); } //自定义一个支付的方法 public MsqResult pay(String paykey){ PayAccess payAccess=PayStrategy.get(paykey); System.out.println("欢迎使用"+payAccess.getName()); System.out.println("本次交易金额为:"+amount+",开始扣款..."); return payAccess.pay(uid,amount); } }
用一个类来模拟支付后的状态,主要是做判断,是否支付成功等等
package paymethod; /** * 支付完成以后的状态 * @author lp */ public class MsqResult { private int code; private Object data; private String msg; public MsqResult(int code, Object data, String msg) { this.code = code; this.data = data; this.msg = msg; } @Override public String toString() { return ("支付状态:["+code+"],"+msg+",交易详情,"+data); } }
每一种支付都模拟了一个金额,用来做判断逻辑,接下来就是测试类了,这里面的支付策略是你定义的,可以随意更换测试
package paymethod; /** * 测试类 * @author lp */ public class PayStrategyTest { public static void main(String[] args) { //省略了其他步骤,直接开始付款 Order order=new Order("1","20190821",900); //支付的时候决定了使用哪一个 System.out.println(order.pay(PayStrategy.UNION_PAY)); } }