亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java使用策略模式實現(xiàn)聚石塔接口調(diào)用的問題

 更新時間:2021年12月30日 09:52:19   作者:l去留無心  
這篇文章主要介紹了Java使用策略模式實現(xiàn)聚石塔接口調(diào)用,為了避免多重判斷,而且有更好的擴展性,首選了策略模式來實現(xiàn),具體解決方法跟隨小編一起看看吧

背景

有個業(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)文章

  • RabbitMQ下載與安裝教程

    RabbitMQ下載與安裝教程

    RabbitMQ是實現(xiàn)了高級消息隊列協(xié)議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件),這篇文章給大家介紹RabbitMQ下載與安裝教程,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Spring中的spring.factories文件用法(Spring如何加載第三方Bean)

    Spring中的spring.factories文件用法(Spring如何加載第三方Bean)

    這篇文章主要介紹了Spring中的spring.factories文件用法(Spring如何加載第三方Bean),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 淺談Java中Lock和Synchronized的區(qū)別

    淺談Java中Lock和Synchronized的區(qū)別

    這篇文章主要介紹了Java中Lock和Synchronized的區(qū)別,Lock和Synchronized都是java中去用來解決線程安全問題的一個工具,但是具體有什么區(qū)別呢?下面我們一起進入文章了解具體詳細內(nèi)容吧,需要的朋友可以參考一下
    2022-04-04
  • Java利用endorsed如何覆蓋jdk提供的類詳解

    Java利用endorsed如何覆蓋jdk提供的類詳解

    這篇文章主要給大家介紹了關(guān)于Java利用endorsed如何覆蓋jdk提供的類的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Springmvc如何返回xml及json格式數(shù)據(jù)

    Springmvc如何返回xml及json格式數(shù)據(jù)

    這篇文章主要介紹了Springmvc如何返回xml及json格式數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java文件上傳下載代碼實例

    java文件上傳下載代碼實例

    這篇文章主要介紹了java文件上傳下載,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • springboot基于keytool實現(xiàn)https的雙向認證示例教程

    springboot基于keytool實現(xiàn)https的雙向認證示例教程

    這篇文章主要介紹了springboot基于keytool實現(xiàn)https的雙向認證,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • springboot整合vue項目(小試牛刀)

    springboot整合vue項目(小試牛刀)

    這篇文章主要介紹了springboot整合vue項目(小試牛刀),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Spring Boot XSS 攻擊過濾插件使用

    Spring Boot XSS 攻擊過濾插件使用

    這篇文章主要介紹了Spring Boot XSS 攻擊過濾插件使用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java實現(xiàn)冪等性校驗的示例代碼

    Java實現(xiàn)冪等性校驗的示例代碼

    我們在做web應(yīng)用的時候通常會遇到前端提交按鈕重復(fù)點擊的場景,在某些新增操作上就需要做冪等性限制來保證數(shù)據(jù)的可靠性,所以本文主要介紹了如何使用java?aop實現(xiàn)冪等性校驗,需要的可以參考下
    2024-02-02

最新評論