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