设为首页 加入收藏

TOP

基于接口设计与编程(二)
2018-04-08 08:51:22 】 浏览:441
Tags:基于 接口 设计 编程
quest) { // export for orderExportRequest } private void check(GeneralExportRequest generalExportRequest) { // check bizType // check source // check templateId // check shopId // check general params } } @Data class GeneralExportRequest { private String bizType; private String source; private String templateId; private String shopId; // general export param }

可以看到,检测基本的参数、保存导出记录,生成并提交导出任务,流程及实现几乎一样,可是由于之前方法限制传入请求的实现类,使得之前的方法都无法复用,进一步导致大段大段的重复代码, 而若在原有基础上改造,则要冒破坏现有系统逻辑和实现的很大风险,真是进退两难。

解决

怎么解决呢? 最好能够预先做好设计,设计出基于接口的导出流程框架,然后编写所需要实现的方法。

定义接口

由于传递具体的请求类限制了复用,因此,需要设计一个请求类的接口,可以获取通用导出参数, 具体的请求类实现该接口:

public interface IExportRequest {

  // common methods to be implemented

}

class OrderExportRequest implements IExportRequest {
  // implementations for IExportRequest methods
}

class GeneralExportRequest implements IExportRequest {
  // implementations for IExportRequest methods
}

实现抽象导出

接着,基于导出请求接口,实现抽象的导出流程骨架,如下所示:

package zzz.study.inf;

import com.alibaba.fastjson.JSON;

import java.util.concurrent.ExecutorService;

/**
 * Created by shuqin on 18/3/29.
 */
public abstract class AbstractExportService {

  public String export(IExportRequest exportRequest) {
    checkCommon(exportRequest);
    checkBizParam(exportRequest);
    String exportId = save(exportRequest);
    generateJobFor(exportRequest);
    return exportId;
  }

  private String save(IExportRequest exportRequest) {
    // save export request param into db
    // return exportId
    System.out.println("save export request successfully.");
    return "123";
  }

  private void generateJobFor(IExportRequest exportRequest) {
    getExecutor().execute(() -> exportFor(exportRequest));
    System.out.println("submit export job successfully.");
  }

  public void exportFor(IExportRequest exportRequest) {
    // export for orderExportRequest
    System.out.println("export for export request for" + JSON.toJSONString(exportRequest));
  }

  private void checkCommon(IExportRequest exportRequest) {
    // check bizType
    // check source
    // check templateId
    // check shopId
    System.out.println("check common request passed.");
  }

  public abstract void checkBizParam(IExportRequest exportRequest);
  public abstract ExecutorService getExecutor();

}

具体导出

然后,就可以实现具体的导出了:

订单导出的实现如下:

public class OrderExportService extends AbstractExportService {

  ExecutorService es = Executors.newCachedThreadPool();

  @Override
  public void checkBizParam(IExportRequest exportRequest) {
    System.out.println("check order export request");
  }

  @Override
  public ExecutorService getExecutor() {
    return es;
  }
}

通用导出的实现如下:

ublic class GeneralExportService extends AbstractExportService {

  ExecutorService es = Executors.newFixedThreadPool(10);

  @Override
  public void checkBizParam(IExportRequest exportRequest) {
    System.out.println("check general export request");
  }

  @Override
  public ExecutorService getExecutor() {
    return es;
  }
}

导出服务工厂

定义导出服务工厂,来获取导出服务实例。在实际应用中,通常通过Spring组件注入和管理的方式实现的。

public class ExportServiceFactory {

  private static OrderExportService orderExportService;

  private static GeneralExportService genera
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java日志框架:slf4j作用及其实现.. 下一篇使用FastBootWeixin框架快速开发..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目