Java使用策略模式實現(xiàn)聚石塔接口調(diào)用的問題
背景
有個業(yè)務需求對接淘寶開放平臺。這里面涉及到了聚石塔,聚石塔是阿里系的一款產(chǎn)品,可以理解為一個服務器,淘寶開發(fā)平臺一些較為敏感的數(shù)據(jù),會要求發(fā)布進聚石塔。外部需要調(diào)用要通過走奇門網(wǎng)關。奇門中心也有詳細描述。
研究了一下文檔發(fā)現(xiàn),需要寫兩套代碼:
1、第一套適配聚石塔接口,發(fā)布在聚石塔內(nèi);
2、更新最新的SDK,放在第二套代碼,通過SDK里面的奇門調(diào)用
寫代碼之前還需要在奇門中心配置好自定義api場景,并且規(guī)定好統(tǒng)一的入?yún)⒁约绊憫?/p>

?重點??!聚石塔內(nèi),一個appKey在一個場景內(nèi),只能授權配置一個路由。而且用springmvc接收入?yún)⒉荒苡聾RequestBody,只能用HttpServletRequest。
/**
* 聚石塔
* @param request
* @return
*/
@RequestMapping("tower")
public String tower(HttpServletRequest request) {
// 邏輯
return "";
}
我們需要調(diào)用很多接口,每個接口的url,入?yún)⒍疾煌@怎么辦呢?
我的處理方式是從統(tǒng)一的入?yún)⑷胧?,定義了三個參數(shù):
1)接口類型:type,用來判斷走哪個url
2)授權參數(shù):authParams,用來接收不同的授權入?yún)?/p>
3)接口請求參數(shù):reqParams,用來接收不同接口的不同入?yún)?/p>
相當于一個controller方法要判斷很多個接口
/**
* 聚石塔
* @param request
* @return
*/
@RequestMapping("tower")
public String tower(HttpServletRequest request) {
String type = request.getParameter("type");
if ("1".equals(type)) {
// 具體方法
}
if ("2".equals(type)) {
// 具體方法
}
if ("3".equals(type)) {
// 具體方法
}
if ("4".equals(type)) {
// 具體方法
}
return "";
}
解決方法
為了避免多重判斷,而且有更好的擴展性,首選了策略模式來實現(xiàn)。
1、首先,定義一個策列模式接口,我這邊主要以type來判斷
public interface MethodStrategy {
String selectMethod(String type, HttpServletRequest request);
}
2、然后有多少個接口就寫多少個實現(xiàn)類,我這邊拿一個實現(xiàn)類為例子
public class SmsCreateSignNameClient implements MethodStrategy {
@Override
public String selectMethod(String type, HttpServletRequest request) {
// 獲取授權參數(shù)
String authStr = request.getParameter("authParams");
// 獲取接口請求參數(shù)
String reqStr = request.getParameter("reqParams");
// 這里寫此接口具體的邏輯
}
}
3、創(chuàng)建一個策略類的工廠,相當于總共記錄有多少種類別。這里用strategyMap來存儲。key建議用枚舉類管理起來,代表接口方法,奇門調(diào)用時傳type值時保持一致,value則為具體的實現(xiàn)類。
public class StrategyFactory {
private static StrategyFactory factory = new StrategyFactory();
private static Map strategyMap = new ConcurrentHashMap<>();
static {
// 短信相關,key建議用枚舉類管理起來,代表接口方法,奇門調(diào)用時傳type值時保持一致,value則為具體的實現(xiàn)類
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_SINGLE.getValue(), new SmsSendSingleClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_BATCH.getValue(), new SmsSendBatchClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_OAID.getValue(), new SmsSendOaIdClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_QUERY.getValue(), new SmsSendQueryClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_CREATE_URL.getValue(), new SmsCreateUrlClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_TEMPLATE_CODE_CREATE.getValue(), new SmsCreateTemplateCodeClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_TEMPLATE_CODE_QUERY.getValue(), new SmsTemplateCodeQueryClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_SIGN_NAME_QUERY.getValue(), new SmsSignNameQueryClient());
strategyMap.put(TaoBaoEnums.SmsMethods.SEND_SIGN_NAME_CREATE.getValue(), new SmsCreateSignNameClient());
}
private StrategyFactory() {
}
public MethodStrategy getMethod(String type) {
return (MethodStrategy) strategyMap.get(type);
}
public static StrategyFactory getFactory() {
return factory;
}
}
4、接著配置策略模式上下文
public class MethodContext {
/**
* 方法選擇
* @param type
* @param request
* @return
*/
public String selectMethod(String type, HttpServletRequest request) {
MethodStrategy methodStrategy = StrategyFactory.getFactory().getMethod(type);
return methodStrategy.selectMethod(type, request);
}
}
5、最后,在controller方法
/**
* 聚石塔內(nèi) 一個appKey在一個場景內(nèi)(短信是一個場景,訂單是一個場景)只能授權配置一個路由,因此用一個接口以及策列模式接收一個場景內(nèi)所有的淘寶api接口
*
* @param request 聚石塔入?yún)⒂胷equest接收,此接口的參數(shù)對應為:
* type(接口類型。string)、
* authParams(授權參數(shù)。json的string:appKey,appSecret,sessionKey)、
* reqParams(接口請求參數(shù),每個接口不同,具體需依據(jù)淘寶api接口。json的string)
* @return 此接口響應類,規(guī)定json的string:sub_message:Illegal request、 flag:failure、sub_code:sign-check-failure
*/
@RequestMapping("tower")
public String tower(HttpServletRequest request) {
String type = request.getParameter("type");
MethodContext methodContext = new MethodContext();
return methodContext.selectMethod(type, request);
}
?寫好所有實現(xiàn)類代碼后,即可發(fā)布聚石塔
到此這篇關于Java使用策略模式實現(xiàn)聚石塔接口調(diào)用的文章就介紹到這了,更多相關Java聚石塔接口調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot定時監(jiān)聽RocketMQ的NameServer問題及解決方案
這篇文章主要介紹了SpringBoot定時監(jiān)聽RocketMQ的NameServer問題及解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12
Mybatis實現(xiàn)聯(lián)表查詢并且分頁功能
這篇文章主要介紹了Mybatis實現(xiàn)聯(lián)表查詢并且分頁功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
淺析SpringMVC中的適配器HandlerAdapter
這篇文章主要介紹了SpringMVC中的適配器HandlerAdapter的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
SpringBoot配置Profile實現(xiàn)多環(huán)境支持
這篇文章主要介紹了SpringBoot配置Profile實現(xiàn)多環(huán)境支持操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
解析Mybatis的insert方法返回數(shù)字-2147482646的解決
這篇文章主要介紹了解析Mybatis的insert方法返回數(shù)字-2147482646的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04
SpringBoot使用不同環(huán)境動態(tài)加載不同配置文件
通過在resource目錄下創(chuàng)建不同環(huán)境的配置文件,并在Spring?Boot啟動類中使用環(huán)境變量來加載相應的配置文件,從而實現(xiàn)不同環(huán)境下的配置自動加載2024-11-11
java中Memcached的使用實例(包括與Spring整合)
這篇文章主要介紹了java中Memcached的使用實例(包括與Spring整合),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring Security的持久化用戶和授權實現(xiàn)方式
文章介紹了如何使用JdbcUserDetailsManager實現(xiàn)數(shù)據(jù)庫讀取用戶,并展示了如何配置SpringSecurity進行授權管理,通過創(chuàng)建數(shù)據(jù)庫表、配置數(shù)據(jù)庫連接和修改SecurityConfig,實現(xiàn)了用戶權限的控制2025-02-02

