[Serie de patrones de diseño] Patrón de plantilla de comportamiento

Tabla de contenido

teoría

1. Modo de plantilla : defina un marco en el algoritmo de operación y cargue estos pasos en subclases de forma perezosa.
El patrón del método de plantilla permite que las subclases redefinan ciertos pasos específicos de un algoritmo sin cambiar la estructura del algoritmo;

2. Función : Función de
plantilla de resumen :

  • Se definen una o más operaciones abstractas para que las subclases puedan implementarlas. Estas operaciones abstractas se denominan operaciones básicas y son los pasos constitutivos de una lógica de nivel superior.
  • Definición e implementación de un método de plantilla . Este método de plantilla es generalmente un método concreto , que proporciona un esqueleto de la lógica de nivel superior, y los pasos de composición lógica se difieren a la implementación de la subclase en las operaciones abstractas correspondientes. La lógica de nivel superior también puede llamar a algunos métodos específicos.

Rol de plantilla de hormigón (plantilla de hormigón) :

  • Implemente uno o más métodos abstractos definidos por la clase principal, que son los pasos constitutivos de una lógica de nivel superior.
  • Cada función de plantilla abstracta puede tener cualquier número de funciones de plantilla específicas que le correspondan, y cada función de plantilla específica puede proporcionar diferentes implementaciones de estos métodos abstractos (es decir, los pasos de composición de la lógica de nivel superior), lo que permite la realización de la lógica de nivel superior. Cada uno es diferente.

3. Adecuado para la escena:

  • Implemente la parte invariante de un algoritmo a la vez y deje el comportamiento de la variable a las subclases para implementarlo.
  • Los comportamientos comunes en cada subclase deben extraerse y concentrarse en una clase principal común para evitar la duplicación de código.
  • Es necesario determinar si un cierto paso en el algoritmo de la clase principal se ejecuta a través de la subclase y realizar el control inverso de la subclase a la clase principal.

práctica

  • Clase de plantilla abstracta
package com.qxy.design.template;

/**
 * @author qxy
 * @date 2020/10/16 2:30 下午
 */
public abstract class FileAnalysisTemplate {
    
    

//定义模版方法,对外部访问
    public final void analysisFile() {
    
    
        //1.验证文件后缀
        validateFileSuffix();
        //2.解析文件内容
        analysisFileLine();
        //3.验证文件标题列
        validateFileTitle();
        //处理钩子方法
        if (specialFileColumn()) {
    
    
            handlerSpecialColumn();
        }
        //4.封装pojo
        createPojo();
        //5.交互数据库
        operateDataSource();
    }


    protected void validateFileSuffix() {
    
    
        System.out.println("验证文件后缀成功:文件后缀为.xls或者.xlsx");
    }

    protected void analysisFileLine() {
    
    
        System.out.println("文件解析成功:共用一套解析文件方法或者工具类");
    }

    protected abstract void validateFileTitle();

    protected abstract void createPojo();

    protected void operateDataSource() {
    
    
        System.out.println("数据入库成功");
    }

    /**
     * 是否特殊处理列数据
     * @return false
     */
    protected boolean specialFileColumn() {
    
    
        return false;
    }

    /**
     * 钩子方法:交给子类具体实现处理
     */
    protected void handlerSpecialColumn() {
    
    

    }

}
  • Rol de plantilla específico: ItemAFileAnalysis
package com.qxy.design.template;

/**
 * @author qxy
 * @date 2020/10/16 3:08 下午
 */
public class ItemAFileAnalysis extends FileAnalysisTemplate{
    
    
    @Override
    protected void validateFileTitle() {
    
    
        System.out.println("验证项目A的标题列是否缺失");
    }

    @Override
    protected void createPojo() {
    
    
        System.out.println("创建项目A对象");
    }

    @Override
    protected boolean specialFileColumn() {
    
    
        return true;
    }

    @Override
    protected void handlerSpecialColumn() {
    
    
        System.out.println("特殊处理:处理项目名字");
    }
}
  • Rol de plantilla específico: ItemBFileAnalysis
package com.qxy.design.template;

/**
 * @author qxy
 * @date 2020/10/16 3:10 下午
 */
public class ItemBFileAnalysis extends FileAnalysisTemplate{
    
    
    @Override
    protected void validateFileTitle() {
    
    
        System.out.println("验证项目B的标题列是否缺失");
    }

    @Override
    protected void createPojo() {
    
    
        System.out.println("创建项B对象");
    }
}
  • Cliente
package com.qxy.design.template;
/**
 * @author qxy
 * @date 2020/10/16 3:07 下午
 */
public class FileClient {
    
    
    public static void main(String[] args) {
    
    
        FileAnalysisTemplate aFileAnalysis = new ItemAFileAnalysis();
        aFileAnalysis.analysisFile();
        System.out.println("-----------");
        FileAnalysisTemplate bFileAnalysis = new ItemBFileAnalysis();
        bFileAnalysis.analysisFile();
    }
}

Los resultados son los siguientes:

验证文件后缀成功:文件后缀为.xls或者.xlsx
文件解析成功:共用一套解析文件方法或者工具类
验证项目A的标题列是否缺失
特殊处理:处理项目名字
创建项目A对象
数据入库成功
-----------
验证文件后缀成功:文件后缀为.xls或者.xlsx
文件解析成功:共用一套解析文件方法或者工具类
验证项目B的标题列是否缺失
创建项B对象
数据入库成功

Process finished with exit code 0

para resumir

ventaja:

  1. Encapsular las partes no modificadas y extraer las partes no modificadas;
  2. Extienda la parte variable, establezca el método abstracto de variable y deje que la subclase concreta lo implemente.
  3. El código común extraído es conveniente para un mantenimiento posterior.
  4. Los comportamientos se controlan mediante clases base y las operaciones específicas se implementan mediante subclases.

Desventajas:
Cada implementación diferente necesita una subclase para implementar, lo que hará que el número de clases aumente enormemente, haciendo que el sistema sea aún más grande.

Atención especial :
para evitar que el esqueleto del algoritmo sea destruido u operado de manera maliciosa, generalmente cuando se usa el modo de plantilla, el método de plantilla agregará finalesta palabra clave para limitar.
La clave del patrón de plantilla es que la subclase puede reemplazar la parte variable de la clase principal, pero la subclase no puede cambiar la lógica de nivel superior representada por el método de plantilla .
Siempre que defina una nueva subcategoría, no piense en ella según el pensamiento del flujo de control, sino según el pensamiento de "responsabilidad". En otras palabras, debemos considerar qué operaciones deben reemplazarse, qué operaciones pueden reemplazarse y qué operaciones no pueden ser reemplazadas. El uso del patrón de plantilla puede aclarar estas responsabilidades.

Portal de código fuente: https://github.com/stream-source/stream-source
Material de referencia: patrones de diseño de Java

Supongo que te gusta

Origin blog.csdn.net/xuan_lu/article/details/109367468
Recomendado
Clasificación