最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

背景

有個(gè)業(yè)務(wù)需求對(duì)接淘寶開(kāi)放平臺(tái)。這里面涉及到了聚石塔,聚石塔是阿里系的一款產(chǎn)品,可以理解為一個(gè)服務(wù)器,淘寶開(kāi)發(fā)平臺(tái)一些較為敏感的數(shù)據(jù),會(huì)要求發(fā)布進(jìn)聚石塔。外部需要調(diào)用要通過(guò)走奇門網(wǎng)關(guān)。奇門中心也有詳細(xì)描述。

研究了一下文檔發(fā)現(xiàn),需要寫(xiě)兩套代碼:

1、第一套適配聚石塔接口,發(fā)布在聚石塔內(nèi);

2、更新最新的SDK,放在第二套代碼,通過(guò)SDK里面的奇門調(diào)用

寫(xiě)代碼之前還需要在奇門中心配置好自定義api場(chǎng)景,并且規(guī)定好統(tǒng)一的入?yún)⒁约绊憫?yīng)

?重點(diǎn)?。?/strong>聚石塔內(nèi),一個(gè)appKey在一個(gè)場(chǎng)景內(nèi),只能授權(quán)配置一個(gè)路由。而且用springmvc接收入?yún)⒉荒苡聾RequestBody,只能用HttpServletRequest。

/**
     * 聚石塔
     * @param request
     * @return
     */
    @RequestMapping("tower")
    public String tower(HttpServletRequest request) {
        // 邏輯
        return "";
    }

我們需要調(diào)用很多接口,每個(gè)接口的url,入?yún)⒍疾煌?,這怎么辦呢?

我的處理方式是從統(tǒng)一的入?yún)⑷胧郑x了三個(gè)參數(shù):

1)接口類型:type,用來(lái)判斷走哪個(gè)url

2)授權(quán)參數(shù):authParams,用來(lái)接收不同的授權(quán)入?yún)?/p>

3)接口請(qǐng)求參數(shù):reqParams,用來(lái)接收不同接口的不同入?yún)?/p>

相當(dāng)于一個(gè)controller方法要判斷很多個(gè)接口

  /**
     * 聚石塔
     * @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 "";
    }

解決方法

為了避免多重判斷,而且有更好的擴(kuò)展性,首選了策略模式來(lái)實(shí)現(xiàn)。

1、首先,定義一個(gè)策列模式接口,我這邊主要以type來(lái)判斷

public interface MethodStrategy {
 
    String selectMethod(String type, HttpServletRequest request);
}

2、然后有多少個(gè)接口就寫(xiě)多少個(gè)實(shí)現(xiàn)類,我這邊拿一個(gè)實(shí)現(xiàn)類為例子

public class SmsCreateSignNameClient implements MethodStrategy {
    @Override
    public String selectMethod(String type, HttpServletRequest request) {
        // 獲取授權(quán)參數(shù)
        String authStr = request.getParameter("authParams");
        // 獲取接口請(qǐng)求參數(shù)
        String reqStr = request.getParameter("reqParams");
        // 這里寫(xiě)此接口具體的邏輯
    }
}

3、創(chuàng)建一個(gè)策略類的工廠,相當(dāng)于總共記錄有多少種類別。這里用strategyMap來(lái)存儲(chǔ)。key建議用枚舉類管理起來(lái),代表接口方法,奇門調(diào)用時(shí)傳type值時(shí)保持一致,value則為具體的實(shí)現(xiàn)類。

public class StrategyFactory {
 
    private static StrategyFactory factory = new StrategyFactory();
 
    private static Map strategyMap = new ConcurrentHashMap<>();
 
 
    static {
        // 短信相關(guān),key建議用枚舉類管理起來(lái),代表接口方法,奇門調(diào)用時(shí)傳type值時(shí)保持一致,value則為具體的實(shí)現(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) 一個(gè)appKey在一個(gè)場(chǎng)景內(nèi)(短信是一個(gè)場(chǎng)景,訂單是一個(gè)場(chǎng)景)只能授權(quán)配置一個(gè)路由,因此用一個(gè)接口以及策列模式接收一個(gè)場(chǎng)景內(nèi)所有的淘寶api接口
     *
     * @param request 聚石塔入?yún)⒂胷equest接收,此接口的參數(shù)對(duì)應(yīng)為:
     *                type(接口類型。string)、
     *                authParams(授權(quán)參數(shù)。json的string:appKey,appSecret,sessionKey)、
     *                reqParams(接口請(qǐng)求參數(shù),每個(gè)接口不同,具體需依據(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ě)好所有實(shí)現(xiàn)類代碼后,即可發(fā)布聚石塔

到此這篇關(guān)于Java使用策略模式實(shí)現(xiàn)聚石塔接口調(diào)用的文章就介紹到這了,更多相關(guān)Java聚石塔接口調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot定時(shí)監(jiān)聽(tīng)RocketMQ的NameServer問(wèn)題及解決方案

    SpringBoot定時(shí)監(jiān)聽(tīng)RocketMQ的NameServer問(wèn)題及解決方案

    這篇文章主要介紹了SpringBoot定時(shí)監(jiān)聽(tīng)RocketMQ的NameServer問(wèn)題及解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • Mybatis實(shí)現(xiàn)聯(lián)表查詢并且分頁(yè)功能

    Mybatis實(shí)現(xiàn)聯(lián)表查詢并且分頁(yè)功能

    這篇文章主要介紹了Mybatis實(shí)現(xiàn)聯(lián)表查詢并且分頁(yè)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 淺析SpringMVC中的適配器HandlerAdapter

    淺析SpringMVC中的適配器HandlerAdapter

    這篇文章主要介紹了SpringMVC中的適配器HandlerAdapter的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持

    SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持

    這篇文章主要介紹了SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 解析Mybatis的insert方法返回?cái)?shù)字-2147482646的解決

    解析Mybatis的insert方法返回?cái)?shù)字-2147482646的解決

    這篇文章主要介紹了解析Mybatis的insert方法返回?cái)?shù)字-2147482646的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 基于Spark實(shí)現(xiàn)隨機(jī)森林代碼

    基于Spark實(shí)現(xiàn)隨機(jī)森林代碼

    這篇文章主要為大家詳細(xì)介紹了基于Spark實(shí)現(xiàn)隨機(jī)森林代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • SpringBoot使用不同環(huán)境動(dòng)態(tài)加載不同配置文件

    SpringBoot使用不同環(huán)境動(dòng)態(tài)加載不同配置文件

    通過(guò)在resource目錄下創(chuàng)建不同環(huán)境的配置文件,并在Spring?Boot啟動(dòng)類中使用環(huán)境變量來(lái)加載相應(yīng)的配置文件,從而實(shí)現(xiàn)不同環(huán)境下的配置自動(dòng)加載
    2024-11-11
  • java中Memcached的使用實(shí)例(包括與Spring整合)

    java中Memcached的使用實(shí)例(包括與Spring整合)

    這篇文章主要介紹了java中Memcached的使用實(shí)例(包括與Spring整合),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Security的持久化用戶和授權(quán)實(shí)現(xiàn)方式

    Spring Security的持久化用戶和授權(quán)實(shí)現(xiàn)方式

    文章介紹了如何使用JdbcUserDetailsManager實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀取用戶,并展示了如何配置SpringSecurity進(jìn)行授權(quán)管理,通過(guò)創(chuàng)建數(shù)據(jù)庫(kù)表、配置數(shù)據(jù)庫(kù)連接和修改SecurityConfig,實(shí)現(xiàn)了用戶權(quán)限的控制
    2025-02-02
  • Java 細(xì)致圖解帶你分析漢諾塔

    Java 細(xì)致圖解帶你分析漢諾塔

    漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi Tower),又稱河內(nèi)塔,源于印度一個(gè)古老傳說(shuō)。本文將用Java求解這一問(wèn)題,感興趣的可以學(xué)習(xí)一下
    2022-03-03

最新評(píng)論

桐柏县| 阿克苏市| 萍乡市| 北票市| 大渡口区| 霍林郭勒市| 玛多县| 北川| 体育| 临沂市| 贵溪市| 化隆| 临夏市| 册亨县| 内黄县| 屏东市| 玉山县| 红河县| 兰西县| 阳谷县| 文登市| 三原县| 临海市| 邵阳县| 彭山县| 丘北县| 中阳县| 青铜峡市| 通城县| 宜城市| 西贡区| 绥宁县| 咸宁市| 台中市| 从江县| 巴东县| 罗山县| 平谷区| 彝良县| 安西县| 讷河市|