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::上下文類,持有具體策略類的實例,并負責調(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-09
Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

