(泛型)模板设计模式-阿里云开发者社区

 知识中心     |      2020-07-31 00:00:00

功能 解析excel表格
新接到一个功能 解析一个excel表格。并存储入库。实现很简单。写完过后看着代码面向过程。完全没有复用,扩展一说。我希望能用这个excel解析使用于所有这种类型的excel表格。

设计思路:
使用模板模式将excel表格的解析过程单独抽出来,创建一个独立的类。解析成map,使用Java反射来创建成对应的对象,然后集合存储后返回

实现思路:
在创建的独立类上加上一个泛型用于接收需要去转换的对象实列。创建一个变量去获取泛型的实例类,用于Java反射转换

代码:实现类

/**
* BaseEntity 是公共字典实体类,限定 T 必须为继承
* BaseEntity 有实体类,避免类型传入错误
*/
public class ExcelPoiWordAnalysis<T extends BaseEntity>{

    protected Class<?> tClass = currentModelClass(getClass()) ;


    /**
     *  获取泛型对象
     * @param clazz
     * @return
     */
    protected static Class<?> currentModelClass(Class<?> clazz) {
        // 获取超类
        Type type = clazz.getGenericSuperclass();
        if (!(type instanceof ParameterizedType)){
            throw new RuntimeException("超类没有参数化类型");
        }
        // 获取超累泛型上设置的类
        Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0];
        if (!(trueType instanceof Class)) {
            throw new RuntimeException("没有在超累泛型上设置实际的类");
        }

        return  (Class<?>) trueType;
    }


    @Override
    public List<T> analysis(MultipartFile file) {
        解析方法
    }

    public List<T> taxWorkBook(Workbook workBook){
      poi解析方法实现
    }


    public T transition( Map<String, Object> map) {
        // 反射方法
      
    }

逻辑处理类:

/**
* 继承ExcelPoiWordAnalysis 传入要解析的对象
* 就可以得到解析后的对象集合
*/
@Service
public class BydjAnalysisServiceImpl extends ExcelPoiWordAnalysis<Entity>  {


    @Transactional(rollbackFor = Exception.class)
    @Override
    public int wordAnalysis(MultipartFile file)  {
        List<BydjEntity> analysis = analysis(file);
        //   添加逻辑处理类
        return 1;
    }


}

实体类:


/**
*BaseEntity  是统一字段的公共类就不展示了
*/ 
public class Entity extends BaseEntity {

    private static final long serialVersionUID=1L;



}

模板父类ExcelPoiWordAnalysis。实现 解析和对象转换的解耦。ExcelPoiWordAnalysis只需要完成解析的功能和反射的对象转换。具体解析的文档格式和转换的对象实体则根据子类的传入来定义。当不同不是的excel格式和不同对象时。只需要创建新的子类来继承ExcelPoiWordAnalysis就可以完成文档的解析而子类只需要关注数据库逻辑的处理。