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

策略模式簡介到你結束,此篇博文只作爲簡單的瞭解。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章