Strategy Pattern 策略模式

策略模式是指定义了算法家族并将其封装起来,让它们之间可以相互替换,而不影响使用此算法的用户。

策略模式的应用场景如下

  1. 系统中有很多类,这些类之间区别仅仅在于行为不同。

  2. 一个系统需要动态的在几种算法中选择其中的一种来执行。

举个例子,基本所有的人都有在网上买过东西(比如 服装、书、车票等),在我们选中某个或者某些商品之后,选择付款时会让我们选择付款方式,如:支付宝、银联、微信等,也可能支持第三方的支付。那就以买书写一个小小的例子来简单了解下策略模式:

1、创建支付状态包装类,即返回到前台的信息封装。

public class PayState {
    private int code;
    private Object data;
    private String msg;

    public PayState(int code, Object data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
    }
    
    public String toString(){
        return "支付状态:["+ code +"]," + msg + ",交易详情:" + data ;
    }
}

2、创建支付抽象类 Payment

public abstract class patment {
    // 支付类型
    public String getName();
    // 查询余额
    protected abstract double queryBalance(String uid);
    // 支付扣款
    public Paystate pay(String uid, double amount){
        if(queryBalance(uid)<amount){
            return new Paystate(500,"支付失败","余额不足");
        }
        return new Paystate(200,"支付成功","支付余额:" + amount );
    }
}

3、以下分别创建各种支付方式:

        支付宝支付类

public class AliPay extends Payment {
    public String getName(){
        return "支付宝";
    }
    public double queryBalance(String uid){
        return 900;
    }
}

        微信支付类

public class WechatPay extends Payment {
    public String getName(){
        return "微信";
    }
    public double queryBalance(String uid){
        return 365;
    }
}

        银联支付类

public class UnionPay extends Payment {
    public String getName(){
        return "银联";
    }
    public double queryBalance(String uid){
        return 120;
    }
}

4、创建支付策略管理类

public class PayStrategy{
    public static final String ALI_PAY = "AliPay";
    public static final String WECHAT_PAY = "WechatPay";
    public static final String UNION_PAY = "UnionPay";
    public static final String DEFAULT_PAY = ALI_PAY;

    private static Map<String, Payment> payStrategy = new HashMap<String,Payment>();
    static{
        payStrategy.put(ALI_PAY,new AliPay());
        payStrategy.put(WECHAT_PAY,new WechatPay());
        payStrategy.put(UNION_PAY,new UnionPay());
    }
    public static Payment get(String payKey){
        if(!payStrategy.containsKey(payKey)){
            return payStrategy.get(DEFAULT_PAY);
        }
        return payStrategy.get(payKey);
    }
}

5、创建订单 order 类

public class Order{
    private String uid;
    private Stirng orderId;
    private double amount;

    public Order(String uid, String orderId orderId, double amount){
        this.uid = uid;
        this.orderId = orderId;
        this.amount = amount;
    }
    
    // 解决了代码中的 switch 或者 if else 
    public Payment pay(){
        return pay(PayStrategy.DEFAULT_PAY);
    }

    public Payment pay(String payKey){
        Payment payment = PayStrategy.get(payKey);
        System.out.println("欢迎使用:"payment.getName());
        System.out.println("本次交易金额为:" + amount + ",开始扣款……");
        return payment.pay(uid,amount);
    }
}

6、测试代码如下:

public static void main(String[] args){
    // 为节约代码量 专注于策略模式,此处省略把商品添加到购物车,再从购物车下单。直接从订单开始
    Order order = new Order("1","201908181922401524",324.5);
    // 开始支付,可以选择支付宝、微信、银联中的任意一种
    // 后期如若添加京东、华为等新的支付渠道,只需创建一个新的支付类,及常量即可。
    System.out.println(order.pay(PayStrategy.ALI_PAY));
}

控制台输出如下:

欢迎使用支付宝
本次交易金额为:324.5,开始扣款……
支付状态:[200],支付成功,交易详情:支付金额:324.5

策略模式简介到你结束,此篇博文只作为简单的了解。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值