做網(wǎng)站數(shù)據(jù)庫及相關(guān)配置小程序搭建
策略模式的定義
策略設(shè)計模式是一種行為設(shè)計模式。當在處理一個業(yè)務(wù)時,有多種處理方式,并且需要再運行時決定使哪一種具體實現(xiàn)時,就會使用策略模式。
策略模式的類圖:
策略模式的實現(xiàn)
在支付業(yè)務(wù)中,有三種付款方式,程序運行時使用哪種方式由用戶選擇,根據(jù)用戶選擇執(zhí)行不同的邏輯。
- 首先,我們需要將支付方式這一行為抽象為一個策略接口,代表支付方式的抽象。
public interface PaymentStrategy {public void payment(BigDecimal amount);}
- 然后我們再針對需要支持的三種支付方式建立對應(yīng)的策略實現(xiàn)類。
銀行卡支付策略
public class CreditPaymentStrategy implements PaymentStrategy{@Overridepublic void payment(BigDecimal amount) {System.out.println("使用銀行卡支付" + amount);// 去調(diào)用網(wǎng)聯(lián)接口}
}
微信支付策略
public class WechatPaymentStrategy implements PaymentStrategy{@Overridepublic void payment(BigDecimal amount) {System.out.println("使用微信支付" + amount);// 調(diào)用微信支付API}
}
支付寶支付策略
public class AlipayPaymentStrategy implements PaymentStrategy {@Overridepublic void payment(BigDecimal amount) {System.out.println("使用支付寶支付" + amount);// 調(diào)用支付寶支付API}
}
- 然后重新實現(xiàn)我們的支付服務(wù)PaymentService。
public class PaymentService {/*** 將strategy作為參數(shù)傳遞給支付服務(wù)*/public void payment(PaymentStrategy strategy, BigDecimal amount) {strategy.payment(amount);}
}
我們將支付策略作為參數(shù)傳遞給支付服務(wù),在支付服務(wù)中只需要按照運行時傳的支付策略對象進行支付就可以了。
我們來測試一下使用策略模式之后的代碼。
public class StrategyTest {public static void main(String[] args) {PaymentService paymentService = new PaymentService();// 使用微信支付paymentService.payment(new WechatPaymentStrategy(), new BigDecimal("100"));//使用支付寶支付paymentService.payment(new AlipayPaymentStrategy(), new BigDecimal("100"));}
}
運行結(jié)果:
在使用了策略模式之后,在我們的支付服務(wù)PaymentService中便不需要寫復(fù)雜的if…else,如果需要新增加一種支付方式,只需要新增一個新的支付策略實現(xiàn),這樣就滿足了開閉原則,并且對其他支付方式的業(yè)務(wù)邏輯也不會造成影響,擴展性很好。
JDK中使用策略模式的例子
在JDK中最經(jīng)典的使用策略模式的例子就是Collections.sort(List<T> list, Comparator<? super T> c)
方法,這個方法接受一個比較器Compartor參數(shù),客戶端在運行時可以傳入一個比較器的實現(xiàn),sort()方法中根據(jù)不同實現(xiàn),按照不同的方式進行排序。
總結(jié):
- 如果在一個系統(tǒng)里面有許多類,它們僅僅在行為上有區(qū)別,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為;
- 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種;
- 如果一個對象有很多的行為,如果不用恰當?shù)哪J?#xff0c;這些行為就只好使用多重的條件選擇語句來實現(xiàn)。