設計模式六 策略模式

 

0、 基本定義

定義了算法家族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法對變化,不會影響到使用算法到客戶。java

通俗的講,場景有以下一些:旅行的路線、登入方式、爬蟲的目標網站、支付渠道。。。算法

spring 中 BeanFacotry 中有使用。spring

 

本文場景選用 支付渠道設計模式

一、代碼

Order.java微信

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 PayState pay(Payment payment) {
//
//        return payment.pay(uid, amount);
//    }

    //徹底能夠用Payment接口代替, but why?
    //解決了 switch 的過程,和if else
    public PayState pay(PayType payType) {

        return payType.get().pay(uid, amount);
    }

}

 

Payment.javaide

public interface Payment {
    //TODO 每次新增支付渠道,就須要維護, enum
    public final static Payment ALI_PAY = new AliPay();
    public final static Payment WECHAT_PAY = new WechatPay();
    public final static Payment JD_PAY = new JDPay();



    PayState pay(String uid, double amount);

}


public class AliPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("AliPay 支付");
        System.out.println("開始扣款");
        return new PayState(200, "支付成功", null);
    }
}


public class JDPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("AliPay 支付");
        System.out.println("開始扣款");
        return new PayState(200, "支付成功", null);
    }
}

public class WechatPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("JD baitiao 支付");
        System.out.println("開始扣款");
        return new PayState(200, "支付成功", null);
    }
}

 

PayType.java  對用戶操做對優化優化

 

public enum PayType {

    ALI_PAY(new AliPay()),
    WECHAT_PAY(new WechatPay()),
    JD_PAY(new JDPay());

    private Payment payment;
    PayType(Payment payment) {
        this.payment = payment;
    }

    public Payment get() {
        return this.payment;
    }
}

 

Test網站

public class PayStrategyTest {

    public static void main(String[] args) {

        //訂單
        Order order = new Order("1", "201808200000001", 100);

         //支付選擇.微信,支付寶,京東白條
        //每一個支付渠道有特定的算法。
        //基本算法固定

        //用戶決定 支付渠道
//        PayState pay = order.pay(new AliPay());
        PayState pay = order.pay(PayType.JD_PAY);

        System.out.println(pay);
    }
}

 

uml 圖ui

 

二、總結

用戶只需 從定義的算法中進行 選擇this

2.1 優勢

》避免了 不少的 switch 和 if else 的代碼判斷

》算法能夠自由切換

》容易擴展

 

========================================

如今發現,更像是看了咕泡學院視頻後的一些筆記,方便本身之後查找。

單獨的設計模式容易寫,但如今場景中都是 混合模式的。

========================================

參考資料:

咕泡學院

《大話設計模式》

《設計模式之蟬》

相關文章
相關標籤/搜索