定義了算法家族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法對變化,不會影響到使用算法到客戶。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 的代碼判斷
》算法能夠自由切換
》容易擴展
========================================
如今發現,更像是看了咕泡學院視頻後的一些筆記,方便本身之後查找。
單獨的設計模式容易寫,但如今場景中都是 混合模式的。
========================================
參考資料:
咕泡學院
《大話設計模式》
《設計模式之蟬》