(泛型)模板设计模式

简介: 什么是模板设计模式?在父类中定义好算法的骨架,然后在子类中去实现。总的来说就是父类中定义需要实现的总方法,然后在子类中去依次实现它当然根据对象的不同,所实现的具体细节不同。

功能 解析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就可以完成文档的解析而子类只需要关注数据库逻辑的处理。

相关文章
|
2月前
|
设计模式 算法 C++
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(二)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
29 0
|
5月前
|
设计模式 Java
Java设计模式【二十四】:模板模式
Java设计模式【二十四】:模板模式
21 0
|
2月前
|
设计模式 存储 算法
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(三)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
26 0
|
2月前
|
设计模式 算法 搜索推荐
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程(一)
【C++ 泛型编程 进阶篇】C++元模板编程与设计模式的结合应用教程
41 0
|
4月前
|
设计模式 算法 自动驾驶
常见的设计模式(模板与方法,观察者模式,策略模式)
随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数进行组合,最后完成系统的开发,每次需要修改软件,如果不涉及好各个模块的关系,就会导致软件系统难以维护,从而导致软件变得不可使用。面向对象方法用对象模拟问题域中的实体,以对象间的联系刻画实体间联系
68 2
|
4月前
|
设计模式 算法 调度
行为型设计模式:模板设计模式/观察者设计模式/策略设计模式/责任链设计模式
行为型设计模式:模板设计模式/观察者设计模式/策略设计模式/责任链设计模式
34 0
|
4月前
|
设计模式 算法 Go
Golang设计模式——08模板模式
Golang设计模式——08模板模式
26 0
|
27天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
21 0
|
2月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
44 0
|
24天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式