Java設(shè)計模式之策略模式案例詳解
為什么使用策略模式?
答:策略模式是解決過多if-else
(或者switch-case
)代碼塊的方法之一,提高代碼的可維護性、可擴展性和可讀性。
優(yōu)缺點
優(yōu)點
- 算法可以自由切換(高層屏蔽算法,角色自由切換)。
- 避免使用多重條件判斷(如果算法過多就會出現(xiàn)很多種相同的判斷,很難維護)
- 擴展性好(可自由添加取消算法而不影響整個功能)。
缺點
策略類數(shù)量增多(每一個策略類復(fù)用性很小,如果需要增加算法,就只能新增類)。所有的策略類都需要對外暴露(使用的人必須了解使用策略,這個就需要其它模式來補充,比如工廠模式、代理模式)。
Spring中哪里使用策略模式
ClassPathXmlApplicationContext Spring 底層Resource接口采用策略模式
Spring 為Resource 接口提供了如下實現(xiàn)類:
- UrlResource:訪問網(wǎng)絡(luò)資源的實現(xiàn)類。
- ClassPathResource:訪問類加載路徑里資源的實現(xiàn)類。
- FileSystemResource:訪問文件系統(tǒng)里資源的實現(xiàn)類。
- ServletContextResource:訪問相對于ServletContext 路徑里的資源的實現(xiàn)類
- InputStreamResource:訪問輸入流資源的實現(xiàn)類。
- ByteArrayResource:訪問字節(jié)數(shù)組資源的實現(xiàn)類。
策略模式設(shè)計圖
- Strategy::策略接口或者策略抽象類,并且策略執(zhí)行的接口
- ConcreateStrategyA、 B、C等:實現(xiàn)策略接口的具體策略類
- Context::上下文類,持有具體策略類的實例,并負責(zé)調(diào)用相關(guān)的算法
代碼案例
統(tǒng)一支付接口
public interface Payment { /** * 獲取支付方式 * * @return 響應(yīng),支付方式 */ String getPayType(); /** * 支付調(diào)用 * * @param order 訂單信息 * @return 響應(yīng),支付結(jié)果 */ String pay(String order); }
各種支付方式(策略)
@Component public class AlipayPayment implements Payment { @Override public String getPayType() { return "alipay"; } @Override public String pay(String order) { //調(diào)用阿里支付 System.out.println("調(diào)用阿里支付"); return "success"; } } @Component public class BankCardPayment implements Payment { @Override public String getPayType() { return "bankCard"; } @Override public String pay(String order) { //調(diào)用微信支付 System.out.println("調(diào)用銀行卡支付"); return "success"; } } @Component public class WxPayment implements Payment { @Override public String getPayType() { return "weixin"; } @Override public String pay(String order) { //調(diào)用微信支付 System.out.println("調(diào)用微信支付"); return "success"; } }
使用工廠模式來創(chuàng)建策略
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); } }
到此這篇關(guān)于Java設(shè)計模式之策略模式詳解的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式
這篇文章主要介紹了String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05為什么程序中突然多了 200 個 Dubbo-thread 線程的說明
這篇文章主要介紹了為什么程序中突然多了 200 個 Dubbo-thread 線程的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11