Java使用策略模式實現(xiàn)聚石塔接口調(diào)用的問題
背景
有個業(yè)務(wù)需求對接淘寶開放平臺。這里面涉及到了聚石塔,聚石塔是阿里系的一款產(chǎn)品,可以理解為一個服務(wù)器,淘寶開發(fā)平臺一些較為敏感的數(shù)據(jù),會要求發(fā)布進聚石塔。外部需要調(diào)用要通過走奇門網(wǎng)關(guān)。奇門中心也有詳細描述。
研究了一下文檔發(fā)現(xiàn),需要寫兩套代碼:
1、第一套適配聚石塔接口,發(fā)布在聚石塔內(nèi);
2、更新最新的SDK,放在第二套代碼,通過SDK里面的奇門調(diào)用
寫代碼之前還需要在奇門中心配置好自定義api場景,并且規(guī)定好統(tǒng)一的入?yún)⒁约绊憫?yīng)
?重點??!聚石塔內(nèi),一個appKey在一個場景內(nèi),只能授權(quán)配置一個路由。而且用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)⑷胧郑x了三個參數(shù):
1)接口類型:type,用來判斷走哪個url
2)授權(quán)參數(shù):authParams,用來接收不同的授權(quán)入?yún)?/p>
3)接口請求參數(shù):reqParams,用來接收不同接口的不同入?yún)?/p>
相當(dāng)于一個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) { // 獲取授權(quán)參數(shù) String authStr = request.getParameter("authParams"); // 獲取接口請求參數(shù) String reqStr = request.getParameter("reqParams"); // 這里寫此接口具體的邏輯 } }
3、創(chuàng)建一個策略類的工廠,相當(dā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 { // 短信相關(guān),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)(短信是一個場景,訂單是一個場景)只能授權(quán)配置一個路由,因此用一個接口以及策列模式接收一個場景內(nèi)所有的淘寶api接口 * * @param request 聚石塔入?yún)⒂胷equest接收,此接口的參數(shù)對應(yīng)為: * type(接口類型。string)、 * authParams(授權(quán)參數(shù)。json的string:appKey,appSecret,sessionKey)、 * reqParams(接口請求參數(shù),每個接口不同,具體需依據(jù)淘寶api接口。json的string) * @return 此接口響應(yīng)類,規(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ā)布聚石塔
到此這篇關(guān)于Java使用策略模式實現(xiàn)聚石塔接口調(diào)用的文章就介紹到這了,更多相關(guān)Java聚石塔接口調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中的spring.factories文件用法(Spring如何加載第三方Bean)
這篇文章主要介紹了Spring中的spring.factories文件用法(Spring如何加載第三方Bean),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10淺談Java中Lock和Synchronized的區(qū)別
這篇文章主要介紹了Java中Lock和Synchronized的區(qū)別,Lock和Synchronized都是java中去用來解決線程安全問題的一個工具,但是具體有什么區(qū)別呢?下面我們一起進入文章了解具體詳細內(nèi)容吧,需要的朋友可以參考一下2022-04-04Springmvc如何返回xml及json格式數(shù)據(jù)
這篇文章主要介紹了Springmvc如何返回xml及json格式數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09springboot基于keytool實現(xiàn)https的雙向認證示例教程
這篇文章主要介紹了springboot基于keytool實現(xiàn)https的雙向認證,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06