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

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

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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值