咱們以一個例子來講明策略模式: 在咱們的項目中有個需求:用戶提交完訂單須要進行支付的時候能夠選擇不一樣的支付方式,支付方式有三種:支付寶、微信和銀聯。<br> 一般的實現方式是使用if...else語句進行實現:<br>算法
if ( payType.equals("支付寶") ){ // 調用支付寶支付的算法... } else if ( payType.equals("微信") ){ //調用微信的支付算法... } else if (payType.equals("銀聯") ){ //調用銀聯支付算法... }
以上的實現思路極不推薦,它的缺點也很是的明顯,對支付方式的選擇嚴重耦合在了代碼中,對後期的維護和擴展極不方便,假如咱們後期對需求進行疊加,須要添加蘋果支付,那就須要在代碼中再添加蘋果支付的判斷。是否是有一種要瘋的感受.....<br> 下面就可使用策略模式來實現上述需求:微信
首先咱們定義一個支付的抽象接口:app
public interface PayStragety { void pay(String no); }
而後定義一組支付的算法,實現了該抽象接口:ide
//支付寶支付算法 public class Alipay implements PayStragety { @Override public void pay(String no) { System.out.println("帳號:"+no+"使用支付寶進行支付"); } } //微信支付算法 public class WeixinPay implements PayStragety{ @Override public void pay(String no) { System.out.println("帳號:"+no+"使用微信支付"); } } //銀聯支付算法 public class YinlianPay implements PayStragety{ @Override public void pay(String no) { System.out.println("帳號:"+no+"使用銀聯支付"); } }
以上是對一系列支付算法的封裝,下面咱們來使用組合的方式來對算法進行調用<br> 建立算法持有的類:測試
public class User { // 策略接口 private PayStragety payStragety; public void setPayStragety(PayStragety payStragety) { this.payStragety = payStragety; } public void executePay(String no) { payStragety.pay(no); } }
用戶中有進行支付的方法,經過持有支付策略接口的引用,在進行支付的時候執行策略接口中的支付方法,對於不一樣的支付接口實現調用不一樣的支付方法(很是巧妙的設計,組合方式和多態的使用,易於擴展)<br>微信支付
下面咱們來測試一下:<br>this
public static void main(String[] args) { User u1 = new User(); u1.setPayStragety(new Alipay()); u1.executePay("328239232"); User u2 = new User(); u2.setPayStragety(new WeixinPay()); u2.executePay("328239233"); User u3 = new User(); u3.setPayStragety(new YinlianPay()); u3.executePay("328239234"); }
執行結果:<br>設計
帳號:328239232使用支付寶進行支付 帳號:328239233使用微信支付 帳號:328239234使用銀聯支付
因而可知,傳入不一樣的策略類,實現了對不一樣支付方式的調用,實現了咱們的需求<br> 假如咱們需求對其進行擴展,添加ApplePay的方式,那咱們只須要定義ApplePay的支付策略類,實現支付策略接口,在調用的時候傳入ApplePay支付對象就能夠了,不須要再進行改源碼了。<br> 建立ApplePay支付策略:<br>code
public class ApplePay implements PayStragety{ @Override public void pay(String no) { System.out.println("The number:"+ no+"use the apple Pay"); } }
調用Apple支付策略:<br>對象
User appleUser = new User(); appleUser.setPayStragety(new ApplePay()); appleUser.executePay("88833434");
執行結果:<br>
The number:88833434use the apple Pay
到此爲止,策略模式的簡單實現已經完成,下面我來看一下策略模式的優缺點:<br> 優勢:
不一樣的策略類實現了共同的接口,能夠進行自由的切換。
易於擴展,能夠在不修改源碼的基礎上進行擴展。
避免了使用多重if...else條件的判斷,減小了代碼的複雜性。<br> 缺點:
要維護多種策略類,增長了系統的開銷。
對於客戶端的調用,必須暴露全部的策略類,客戶端必須瞭解全部策略類以及策略類之間的區別。