Java使用策略模式实现聚石塔接口调用的问题

背景

有个业务需求对接淘宝开放平台。这里面涉及到了聚石塔,聚石塔是阿里系的一款产品,可以理解为一个服务器,淘宝开发平台一些较为敏感的数据,会要求发布进聚石塔。外部需要调用要通过走奇门网关。奇门中心也有详细描述。

研究了一下文档发现,需要写两套代码:

1、第一套适配聚石塔接口,发布在聚石塔内;

2、更新最新的SDK,放在第二套代码,通过SDK里面的奇门调用

写代码之前还需要在奇门中心配置好自定义api场景,并且规定好统一的入参以及响应

 重点!!聚石塔内,一个appKey在一个场景内,只能授权配置一个路由。而且用springmvc接收入参不能用@RequestBody,只能用HttpServletRequest。

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

我们需要调用很多接口,每个接口的url,入参都不同,这怎么办呢?

我的处理方式是从统一的入参入手,定义了三个参数:

1)接口类型:type,用来判断走哪个url

2)授权参数:authParams,用来接收不同的授权入参

3)接口请求参数:reqParams,用来接收不同接口的不同入参

相当于一个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 "";
    }

解决方法

为了避免多重判断,而且有更好的扩展性,首选了策略模式来实现。

1、首先,定义一个策列模式接口,我这边主要以type来判断

public interface MethodStrategy {

    String selectMethod(String type, HttpServletRequest request);
}

2、然后有多少个接口就写多少个实现类,我这边拿一个实现类为例子

public class SmsCreateSignNameClient implements MethodStrategy {
    @Override
    public String selectMethod(String type, HttpServletRequest request) {
        // 获取授权参数
        String authStr = request.getParameter("authParams");
        // 获取接口请求参数
        String reqStr = request.getParameter("reqParams");
        // 这里写此接口具体的逻辑
    }
}

3、创建一个策略类的工厂,相当于总共记录有多少种类别。这里用strategyMap来存储。key建议用枚举类管理起来,代表接口方法,奇门调用时传type值时保持一致,value则为具体的实现类。

public class StrategyFactory {

    private static StrategyFactory factory = new StrategyFactory();

    private static Map strategyMap = new ConcurrentHashMap<>();

    static {
        // 短信相关,key建议用枚举类管理起来,代表接口方法,奇门调用时传type值时保持一致,value则为具体的实现类
        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方法

    /**
     * 聚石塔内 一个appKey在一个场景内(短信是一个场景,订单是一个场景)只能授权配置一个路由,因此用一个接口以及策列模式接收一个场景内所有的淘宝api接口
     *
     * @param request 聚石塔入参用request接收,此接口的参数对应为:
     *                type(接口类型。string)、
     *                authParams(授权参数。json的string:appKey,appSecret,sessionKey)、
     *                reqParams(接口请求参数,每个接口不同,具体需依据淘宝api接口。json的string)
     * @return 此接口响应类,规定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);
    }

 写好所有实现类代码后,即可发布聚石塔

到此这篇关于Java使用策略模式实现聚石塔接口调用的文章就介绍到这了,更多相关Java聚石塔接口调用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java 使用策略模式操作JDBC数据库

    java 使用策略模式操作JDBC数据库 1:构造一个操作数据库的工具类,可以获得连接和释放连接 public class DBUtil { private static Connection conn = null; static { //静态初始块 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/tes

  • java实现策略模式使用示例

    思路如下: 使用interface来定义一个接口,在该接口中定义save()方法:根据图片格式定义不同的类,分别在这些类中使用关键字implements实现接口:创建一个实现选择的类,在该类中定义实现选择的方法,该方法返回值为对应的图片保存类:在主方法中实现接口.代码如下: 复制代码 代码如下: public interface ImageSaver {    void save();//定义save()方法} public class GIFSaver implements ImageSave

  • Java使用策略模式解决商场促销商品问题示例

    本文实例讲述了Java使用策略模式解决商场促销商品问题.分享给大家供大家参考,具体如下: 一 模式定义 策略模式:定义一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化. 二 模式举例 1 模式分析 我们借用商场促销商品来说明这一模式. 2 策略模式静态类图 3 代码示例 3.1 创建策略接口一IStrategy package com.demo.strategy; /** * 策略接口 * * @author * */ public inter

  • Java使用策略模式实现聚石塔接口调用的问题

    背景 有个业务需求对接淘宝开放平台.这里面涉及到了聚石塔,聚石塔是阿里系的一款产品,可以理解为一个服务器,淘宝开发平台一些较为敏感的数据,会要求发布进聚石塔.外部需要调用要通过走奇门网关.奇门中心也有详细描述. 研究了一下文档发现,需要写两套代码: 1.第一套适配聚石塔接口,发布在聚石塔内: 2.更新最新的SDK,放在第二套代码,通过SDK里面的奇门调用 写代码之前还需要在奇门中心配置好自定义api场景,并且规定好统一的入参以及响应  重点!!聚石塔内,一个appKey在一个场景内,只能授权配置

  • java设计模式策略模式图文示例详解

    目录 策略模式 意图 问题 解决方案 真实世界类比 策略模式结构 伪代码 策略模式适合应用场景 实现方式 策略模式优缺点 策略模式优缺点 与其他模式的关系 策略模式 亦称:Strategy 意图 策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换. 问题 一天,你打算为游客们创建一款导游程序.该程序的核心功能是提供美观的地图,以帮助用户在任何城市中快速定位. 用户期待的程序新功能是自动路线规划:他们希望输入地址后就能在地图上看到前往目的

  • Java之策略模式比较器案例讲解

    Comparable 比较器,内置定义的比较方法,实现比较 较简单 Comparator 策略模式,需要定义不同的策略和比较的对象,实现比较 较复杂 打个比方,狗有foot一种属性我们用Comparable比较器完成比较 猫有height和weight两种属性,我们用Comparator策略模式完成比较 一.Comparable --狗比较 缺点:自定义排序规则,规则定义好之后,再改起来就不方便,还需要重新开发Sort比较类 1.狗对象 package com.longze.guosh.stra

  • Java利用策略模式实现条件判断,告别if else

    目录 定义 使用场景 案例 需求 实现方案 方案分析 总结 定义 策略模式定义了一系列算法,并且将每个算法封装起来,使得他们可以相互替换,而且算法的变化不会影响使用算法的客户端. 使用场景 一个系统需要动态的在几种算法中选择一种,可以把每个算法封装到具体的策略类中 一个类中定义了多种行为,可以去代替条件转移语句,减少硬编码 系统中各个算法或者说函数是彼此独立的,而且要求对客户隐藏算法具体实现细节的时候 多个类只区别在表现行为的不同,可以使用策略模式,在运行时动态的选择要执行的行为 案例 需求 根

  • 一起来了解Java的策略模式

    目录 策略模式 1.什么是策略模式 2.策略模式的优缺点 3.策略模式的结构 4.代码实现 5.策略模式的应用场景 总结 策略模式 策略模式属于Java 23种设计模式中行为模式之一,那先看看什么是策略模式. 1.什么是策略模式 策略模式的定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户.策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理. 其实我们在现实生活中常常

  • java设计模式--策略模式详解

    目录 策略模式 Demo 代码: 总结 策略模式 策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.用算法族分别封装起来,实现同一个接口,让他们之间可以互相替换,让算法的变化独立于使用算法的客户. 主要解决:在有多种算法相似的情况下,使用 if-else 所带来的复杂和难以维护. 如何解决:将这些算法封装成一个一个的类,任意地替换. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为. 使用场景: 如果在一个系统

  • Java利用策略模式优化过多if else代码

    前言 不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧. 比如平时大家是否都会写类似这样的代码: if(a){ //dosomething }else if(b){ //doshomething }else if(c){ //doshomething } else{ ////doshomething } 条件少还好,一旦 else if 过多这里的逻辑将会比较混乱,并很容易出错. 比如这样: 摘自cim中的一个客户端命令的判断条件. 刚开始条件较少,也就没管那么多直接写的:

随机推荐