策略模式
參考博文
http://baijiahao.baidu.com/s?id=1601547440739500969&wfr=spider&for=pc
概念
其思想是針對一組算法,將每一種算法都封裝到具有共同接口的獨立的類中,從而使它們可以相互替換。策略模式的最大特點是使得算法可以在不影響客戶端的情況下發(fā)生變化,從而改變不同的功能。
特點
- 封裝變化的概念。
- 編程中使用接口,而不是使用的是具體的實現(xiàn)類(面向接口編程)。
比如說我們要實現(xiàn)對一個數(shù)組的元素排序,但是到底是要升序還是降序,這個完全由我們來去控制。我們可以把排序的方式全部封裝起來去實現(xiàn)同一個接口,傳給替我們執(zhí)行策略的類
代碼
現(xiàn)在有個場景:客戶下訂單,需要采用多種支付方式。(這里僅做簡單邏輯)
-
頂層策略接口Payment
package com.pmz.strategy; public interface Payment { void pay(int id,double account); }支付方式對外提供的統(tǒng)一接口
-
支付寶支付AliPay實現(xiàn)頂層策略接口Payment
package com.pmz.strategy; public class AliPay implements Payment { @Override public void pay(int id, double account) { System.out.println("id為"+id+"的用戶,使用支付寶支付了"+account+"元"); } }具體的支付方式
-
微信支付WeChatPay實現(xiàn)頂層策略接口Payment
package com.pmz.strategy; public class WechatPay implements Payment { @Override public void pay(int id, double account) { System.out.println("id為"+id+"的用戶,使用微信支付了"+account+"元"); } }具體的支付方式
-
訂單類 Order
package com.pmz.strategy; public class Order { //將支付方式的接口作為顯示引用 private Payment payment; public Order(Payment payment){ this.payment = payment; } //執(zhí)行策略 public void confirmOrder(int id,double account){ payment.pay(id,account); } }執(zhí)行策略
-
測試類 PaymentStrategyTest
package com.pmz.strategy; public class PaymentStrategyTest { public static void main(String[] args) { //給策略執(zhí)行類傳入相應的策略實現(xiàn) Order order = new Order(new WechatPay()); //傳入?yún)?shù),執(zhí)行策略 order.confirmOrder(1,100.86); } } -
輸出
id為1的用戶,使用微信支付了100.86元
優(yōu)缺點
優(yōu)點:
策略模式符合開閉原則。
避免使用多重條件轉(zhuǎn)移語句,如 if...else...語句、switch 語句
使用策略模式可以提高算法的保密性和安全性。
缺點:
客戶端必須知道所有的策略,并且自行決定使用哪一個策略類。
代碼中會產(chǎn)生非常多策略類,增加維護難度。