策略模式

策略模式简介:

      策略模式定义算法,分别封装起来,让他们可以相互替换,此模式的目的是让算法的变化独立于使用方法的用户。(比如:支付接口的选择(支付宝,京东白条,微信支付,银联卡....)),策略模式关心的是我们如何去选择,最终的结果都是一样的

     策略模式的应用:1、比较器比较算法的定义  2、支付接口的调用  3、爬虫爬不同网站时使用不同策略但最后都返回相同格式的json

     spring中策略模式的应用 :Spring中BeanFactroy有很多种,会根据用户不同的配置决定使用哪个BeanFactroy(工厂模式与策略模式的结合)

     策略模式Demo

      一支付为例,构建策略模式的demo

/**
 * @description: 支付完成后的状态
 **/
public class PayState {
    private int code;
    private Object data;
    private String msg;

    public PayState(int code, String msg, Object data) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    public String toString(){
        return "支付状态:[" + code + "]," + msg + ",交易详情:" + data;
    }
}
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;
    }

    //PayType 完全可以用Payment 这个接口代替
    //为什么?不用接口代替,
    // 是因为使用枚举完美的解决了switch的过程
    //不需要在代码中写switch 更不需要写 else if
    public  PayState pay(Integer payType){
        return PayType.getPayment(payType).pay(this.uid,this.amount);
    }
}
//支付接口,策略接口
public interface Payment {
     PayState pay(String uid,double amount);
}
/**
 * @description: 增加一个渠道只需要修改枚举即可,姑且把枚举当做常量池来维护
 **/
public enum PayType {

    ALI_PAY(1,new AliPay()),
    WECHAT_PAY(2,new WechatPay()),
    JD_PAY(3,new JDPay()),
    UNION_PAY(4,new UnionPay());

    private  Integer type;
    private Payment payment;

    PayType(Integer type,Payment payment){
        this.type = type;
        this.payment = payment;
    }


    public Integer getType() {
        return type;
    }

    public Payment getPayment() {
        return payment;
    }

    //通过 Type 获取支付的Payment

    public static Payment getPayment(Integer type){
        for (PayType payType : PayType.values()) {
            if(payType.getType().equals(type)){
                return payType.getPayment();
            }
        }
        return  null;
    }
}
//支付宝支付算法
public class AliPay implements Payment{

    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用支付宝");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200, "支付成功",amount);
    }
}
//微信支付算法
public class WechatPay implements Payment{

    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用微信支付");
        System.out.println("直接从微信红包扣款");
        return new PayState(200, "支付成功",amount);
    }
}
//京东支付算法
public class JDPay implements Payment{

    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用京东白条");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200, "支付成功",amount);
    }
}
//银联支付算法
public class UnionPay implements Payment{

    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("欢迎使用银联卡支付");
        System.out.println("查询账户余额,开始扣款");
        return new PayState(200, "支付成功",amount);
    }
}
//策略模式客户端,测试类调用
public class PayStrategyTest {

    public static void main(String[] args) {
        //省略把商品添加到购物车,再从购物车下单
        //直接从订单开始
        Order order = new Order("1", "20180311001000009", 2324.1);
        //开始支付 选择微信支付宝,微信支付,银联卡,京东白条,财付通
        //每个渠道支付的具体算法是不一样的
        //基本算法是固定的
        // 这个值是用户再支付的时候才决定 用哪个值  若不用payType 去做就要写switch 或者if else
        //通过用户传的 payType值获取么=枚举结果值
        // 客户只需要传哪一种类型的支付即可      用户在前端页面选择的就是1、2、3,通过枚举映射创建需要的支付策略
        System.out.println(order.pay(3));
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值