設計模式探索之策略模式

咱們以一個例子來講明策略模式: 在咱們的項目中有個需求:用戶提交完訂單須要進行支付的時候能夠選擇不一樣的支付方式,支付方式有三種:支付寶、微信和銀聯。<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> 優勢:

  1. 不一樣的策略類實現了共同的接口,能夠進行自由的切換。

  2. 易於擴展,能夠在不修改源碼的基礎上進行擴展。

  3. 避免了使用多重if...else條件的判斷,減小了代碼的複雜性。<br> 缺點:

  4. 要維護多種策略類,增長了系統的開銷。

  5. 對於客戶端的調用,必須暴露全部的策略類,客戶端必須瞭解全部策略類以及策略類之間的區別。

相關文章
相關標籤/搜索