Java設計模式之策略模式案例詳解
為什麼使用策略模式?
答:策略模式是解決過多if-else
(或者switch-case
)代碼塊的方法之一,提高代碼的可維護性、可擴展性和可讀性。
優缺點
優點
- 算法可以自由切換(高層屏蔽算法,角色自由切換)。
- 避免使用多重條件判斷(如果算法過多就會出現很多種相同的判斷,很難維護)
- 擴展性好(可自由添加取消算法而不影響整個功能)。
缺點
策略類數量增多(每一個策略類復用性很小,如果需要增加算法,就隻能新增類)。所有的策略類都需要對外暴露(使用的人必須瞭解使用策略,這個就需要其它模式來補充,比如工廠模式、代理模式)。
Spring中哪裡使用策略模式
ClassPathXmlApplicationContext Spring 底層Resource接口采用策略模式
Spring 為Resource 接口提供瞭如下實現類:
- UrlResource:訪問網絡資源的實現類。
- ClassPathResource:訪問類加載路徑裡資源的實現類。
- FileSystemResource:訪問文件系統裡資源的實現類。
- ServletContextResource:訪問相對於ServletContext 路徑裡的資源的實現類
- InputStreamResource:訪問輸入流資源的實現類。
- ByteArrayResource:訪問字節數組資源的實現類。
策略模式設計圖
- Strategy::策略接口或者策略抽象類,並且策略執行的接口
- ConcreateStrategyA、 B、C等:實現策略接口的具體策略類
- Context::上下文類,持有具體策略類的實例,並負責調用相關的算法
代碼案例
統一支付接口
public interface Payment { /** * 獲取支付方式 * * @return 響應,支付方式 */ String getPayType(); /** * 支付調用 * * @param order 訂單信息 * @return 響應,支付結果 */ String pay(String order); }
各種支付方式(策略)
@Component public class AlipayPayment implements Payment { @Override public String getPayType() { return "alipay"; } @Override public String pay(String order) { //調用阿裡支付 System.out.println("調用阿裡支付"); return "success"; } } @Component public class BankCardPayment implements Payment { @Override public String getPayType() { return "bankCard"; } @Override public String pay(String order) { //調用微信支付 System.out.println("調用銀行卡支付"); return "success"; } } @Component public class WxPayment implements Payment { @Override public String getPayType() { return "weixin"; } @Override public String pay(String order) { //調用微信支付 System.out.println("調用微信支付"); return "success"; } }
使用工廠模式來創建策略
public class PaymentFactory { private static final Map<String, Payment> payStrategies = new HashMap<>(); static { payStrategies.put("weixin", new WxPayment()); payStrategies.put("alipay", new AlipayPayment()); payStrategies.put("bankCard", new BankCardPayment()); } public static Payment getPayment(String payType) { if (payType == null) { throw new IllegalArgumentException("pay type is empty."); } if (!payStrategies.containsKey(payType)) { throw new IllegalArgumentException("pay type not supported."); } return payStrategies.get(payType); } }
測試類
public class Test { public static void main(String[] args) { String payType = "weixin"; Payment payment = PaymentFactory.getPayment(payType); String pay = payment.pay(""); System.out.println(pay); } }
到此這篇關於Java設計模式之策略模式詳解的文章就介紹到這瞭,更多相關Java策略模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot 在項目啟動之後執行自定義方法的兩種方式小結
- java設計模式-組合模式詳解
- 小程序開發調用微信支付以及微信回調地址配置
- springBoot啟動時讓方法自動執行的幾種實現方式
- 淺談SpringBoot Bean加載優先級的問題