用一个支付案例带你理解策略模式(模拟不同的支付)

首先创建一个支付渠道的抽象类

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) 
  

然后就是创建支付策略类

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 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));
    }
}

 

 

你可能感兴趣的:(用一个支付案例带你理解策略模式(模拟不同的支付))