美文网首页
相同结构不同业务的模版方法抽象

相同结构不同业务的模版方法抽象

作者: n油炸小朋友 | 来源:发表于2020-08-12 14:24 被阅读0次

背景介绍:

A服务是基础服务,靠一个appid做省份的隔离,这个appid需要调用方设置请求头传入,一般情况是前端请求,用户的数据自然可以得知省份;
B服务做统计的业务,需要从A服务读取数据。这个调用完全是后端之间的服务调用,所以需要自己设置appid的请求头。同时旧的结构是没做省份隔离的,所以需要读所有省份的数据合并返回与旧的返回结果结构相同,才能兼容旧的代码。

实现

一开始想用代理模式,不过这样会需要改动原来的业务代码,又想到每个请求的结构类似,所以抽象出如下的代码:

  1. 把appid设置在配置文件里面
  2. 模版
@Slf4j
public abstract class AbstractItemsUomClientTemplate<T extends BaseVo> {

    public abstract void checkParam();

    public abstract T call();

    public abstract String getErrorMsgTitle();

    public final T execute(List<String> appIdList) {
        if(CollectionUtils.isEmpty(appIdList)) {
            return null;
        }
        checkParam();

        List<T> voList = new ArrayList<>();
        appIdList.stream().forEach(appId -> {
            try {
                XXXXXContext.setSdpAppId(appId);
                T vo = call();
                if (vo != null && CollectionUtils.isNotEmpty(vo.getItems())) {
                    voList.add(vo);
                }
            } catch (Exception e) {
                log.error(getErrorMsgTitle(),e);
            }
        });
        if(CollectionUtils.isEmpty(voList)) {
            return null;
        }
         //  把每个省份的数据合并
        return (T) merge(voList);
    }
}
  1. 使用:
    把请求头的部分提取出来,下次再写的时候,只需要关注业务调用,省份的隔离变得无感知了
public XXX  getXXXXXByXXXX(......) {

        // ...
        XXX xxx = new AbstractItemsUomClientTemplate<XXX>() {
            @Override
            public void checkParam() {
                //  校验
            }

            @Override
            public XXX call() {
                // 在这里调用A服务
            }

            @Override
            public String getErrorMsgTitle() {
                return "....";
            }
        }.execute(appIdConfig.getList());

        return xxx;
    }

总结

适用于结构类似的方法,抽象出来,方便维护和扩展

相关文章

  • 相同结构不同业务的模版方法抽象

    背景介绍: A服务是基础服务,靠一个appid做省份的隔离,这个appid需要调用方设置请求头传入,一般情况是前端...

  • 12、模版模式

    模版方法侧重于完成一系列动作,操作多个方法,每个方法的含义是一致的,只是内部处理逻辑有相同的,有不同的,通过抽象类...

  • 设计模式之模版方法模式

    模版方法模式 模版方法是一种只需使用继承就可以实现的非常简单的模式模版方法模式由两部分结构组成,第一部分是抽象父类...

  • 设计模式之模版方法模式

    模版方法模式 模版方法是一种只需使用继承就可以实现的非常简单的模式模版方法模式由两部分结构组成,第一部分是抽象父类...

  • 接口和抽象类的异同

    相同点: 均可定义抽象方法 不同点: 抽象类中可以有抽象方法用abstract修饰, 不可用private. 也可...

  • 抽象类和接口的异同

    相同点: 都不能创建对象,都可以有抽象方法 不同点: 抽象类中也可以有普通方法, 接口中都是抽象方法; 抽象类单继...

  • 类的基本定义Swift中的结构体和类非常相似, 但是又有不同之处类是具有相同属性和方法的抽象格式:class 类名...

  • 07 Swift 类\属性\方法\下标(subscripts)

    1. 类 Swift中的结构体和类非常相似,但是又有不同之处类是具有相同属性、方法的抽象格式: 类没有逐一构造器 ...

  • IOS_基类与协议的区别

    相同点 协议和抽象基类都需要子类重写方法 都不可以直接实例化 不同点 抽象基类可以抽取高度相同的方法避免重写多写(...

  • Swift基础语法-类基本定义,类的恒等运算

    1. 类的基本定义 Swift中的结构体和类非常相似, 但是又有不同之处 类是具有相同属性和方法的抽象 类没有逐一...

网友评论

      本文标题:相同结构不同业务的模版方法抽象

      本文链接:https://www.haomeiwen.com/subject/aagpdktx.html