Hable sobre los patrones de diseño utilizados en el proyecto.

1: Modo de estrategia

Escenario empresarial: al publicar una notificación, debe seleccionar el objeto de usuario para recibir la notificación. Puede elegir entre tres opciones: [Departamento], [Centro de pruebas] y [Escuela]. En este momento, la mayoría de los socios pequeños implementan esto camino

 if(type == 部门) {
    //通过部门找到所有的用户
 }
 else if(type == 考点) {
    //通过考点找到所有的用户
 }
 else if(type == 学校) {
    //通过学校找到所有的用户
 }
 
复制代码

Las desventajas de esta implementación son obvias:

  • 1: Si agrega un nuevo tipo ahora, debe agregar otro juicio y continuar implementando la lógica comercial, lo que hará que este método se vuelva cada vez más inflado, difícil de expandir, difícil de mantener y menos legible.
  • 2: Si agrega un nuevo tipo, viola el principio abierto y cerrado de la programación orientada a objetos y el principio único

Como esta lógica de bifurcación con múltiples if... else, podemos usar el patrón de estrategia para resolver

1: Definir una interfaz genérica

public interface NoticeUserInterface {

    //查询处所有需要接收该通知的用户的集合
    List<User> queryAll(Integer type,Integer paramId);

    //类型:1:部门 2:考点 3:学校
    Integer getType();
}
复制代码

2: Definir diferentes implementaciones de estrategia

// 部门
@Service
public class OrganNoticeUserInterfaceImpl  implements NoticeUserInterface{

    @Override
    public List<User> queryAll(Integer type,Integer depId) {
         //具体的实现逻辑,根据部门查找所有接收该通知的用户
    }

    @Override
    public Integer getType() {
        return 1;
    }

}
复制代码
// 考点
@Service
public class KDNoticeUserInterfaceImpl  implements NoticeUserInterface{

    @Override
    public List<User> queryAll(Integer type,Integer kdId) {
         //具体的实现逻辑,根据考点查找所有接收该通知的用户
    }

    @Override
    public Integer getType() {
        return 2;
    }

}
复制代码
// 学校
@Service
public class SchoolNoticeUserInterfaceImpl  implements NoticeUserInterface{

    @Override
    public List<User> queryAll(Integer type,Integer schoolId) {
         //具体的实现逻辑,根据学校查找所有接收该通知的用户
    }

    @Override
    public Integer getType() {
        return 3;
    }

}
复制代码

3: Usa el modo de estrategia


@Component
public class NoticeUserComponent implements ApplicationContextAware {


    private Map<Integer, NoticeUserInterface> iCheckStrategyMap = new ConcurrentHashMap<>();

    public List<User> queryResult(Integer type, Integer paramId) {
        NoticeUserInterface iCheckInterface = iCheckStrategyMap.get(type);
        if (iCheckInterface != null) {
            return iCheckInterface.queryAll(paramId);
        }
        return null;
    }

    //把不同策略放到map
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, NoticeUserInterface> tmepMap = applicationContext.getBeansOfType(NoticeUserInterface.class);
        if(!tmepMap.isEmpty()) {
            for(String beanName : tmepMap.keySet()) {
                NoticeUserInterface noticeUserInterface = tmepMap.get(beanName);
                Integer type = noticeUserInterface.getType();
                iCheckStrategyMap.put(type,noticeUserInterface);
            }
        }
    }
}
复制代码

1: modo de plantilla

En el proyecto, se debe crear una plantilla. Los campos de la plantilla se almacenan en la base de datos. Al generar la plantilla, debe obtener todos los campos de la plantilla de la base de datos y luego generar los correspondientes excel, dbf, y csv. Esto se puede lograr en este momento.


class ExcelHandle {
   void createFile(Long templateId) {
      //从数据库找到该模版所有的字段
      List<String> rows = queryFieldsByTemplateId(templateId);
      //生成文件
      createFile(rows);
   }
}

class DbfHandle {
   void createFile(Long templateId) {
      //从数据库找到该模版所有的字段
      List<String> rows = queryFieldsByTemplateId(templateId);
      //生成文件
      createFile(rows);
   }
}

class CsvHandle {
   void createFile(Long templateId) {
      //从数据库找到该模版所有的字段
      List<String> rows = queryFieldsByTemplateId(templateId);
      //生成文件
      createFile(rows);
   }
}

复制代码

De hecho, ya sea para generar Excel, dbf o csv, todos los campos de la plantilla deben buscarse en la base de datos. Solo cuando se genera un archivo específico, no hay forma de determinarlo. No sé si para generar Excel, DBF o CSV, podemos usar el patrón de plantilla

1: Definir una clase abstracta

public abstract class CreateFileComponents {

    /**
     * 定义抽象方法,根据模版生成Excel,DBF,CSV等文件,具体的实现在子类
     */
    public abstract void create(ArrayList<Map<String, Object>> rows, String name);

    /**
     * 公用方法,生成文件需要从数据库中找到对应的字段生成文件
     * @param templateId
     * @return
     * @throws Exception
     */
    public final void createFile(Integer templateId) throws Exception{
        // 根据模版ID找到该模版所有的字段
        List<String> rows = queryFieldsByTemplateId(templateId);

        //在本地生成预览文件
        create(rows);

        //然后将该文件上传到minio上
        uploadToMinio();
    }
}
复制代码

2: Definir diferentes subclases

//生成Excel文件
public class ExcelFile extends CreateFileComponents{

    @Override
    public void create(ArrayList<Map<String, Object>> rows) {
        //生成Excel
    }
}
复制代码
//生成DBF文件
public class DdfFile extends CreateFileComponents{

    @Override
    public void create(ArrayList<Map<String, Object>> rows) {
        //生成Dbf
      
    }
}
复制代码
//生成CSV文件
public class CsvFile extends CreateFileComponents{

    @Override
    public void create(ArrayList<Map<String, Object>> rows) {
        //生成Dbf
      
    }
}
复制代码

3: Usar el modo de plantilla


CreateFileComponents components =CreateFileFactory.createFileComponents(template.getType());
components.createFile(id);
复制代码

De hecho, el patrón de fábrica simple también se usa aquí.

public class CreateFileFactory {

    public static CreateFileComponents createFileToViewComponents(Integer type) {
        switch (type){
            case 0:
                return new ExcelFile();
            case 1:
                return new DBFFile();
            case 2:
                return new CSVFile();
        }
        return null;
    }
}
复制代码

Supongo que te gusta

Origin juejin.im/post/7085639227844591629
Recomendado
Clasificación