Patrón de método de plantilla: un marco para definir algoritmos

1. Introducción

1.1 Resumen

El patrón de método de plantilla es el patrón de diseño de comportamiento con la estructura más simple.En su estructura, solo existe la relación de herencia entre la clase padre y la subclase. Al usar el patrón de método de plantilla, los pasos de implementación de algunos procesos complejos se pueden encapsular en una serie de métodos básicos. Proporcione un método llamado método de plantilla en la clase principal abstracta para definir el orden de ejecución de estos métodos básicos y cubra algunos pasos a través de sus subclases, de modo que el mismo marco de algoritmo pueda tener diferentes resultados de ejecución. El patrón del método de plantilla proporciona un método de plantilla para definir el marco del algoritmo, y la implementación de algunos pasos específicos se puede completar en sus subclases.

El patrón de método de plantilla es una técnica básica para la reutilización de código basada en la herencia.

1.2 Definición

Patrón de método de plantilla: define el esqueleto de un algoritmo en una operación, delegando algunos pasos a las subclases. El patrón del método de plantilla permite que las subclases redefinan algunos pasos específicos de un algoritmo sin cambiar la estructura del algoritmo. El patrón de método de plantilla es un patrón de comportamiento de clase.

2. Análisis

2.1, diagrama de clases UML

La estructura del patrón del método de plantilla es relativamente simple. Su núcleo es el diseño de la clase abstracta y el método de plantilla en ella. Su estructura se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

  1. AbstractClass (clase abstracta): En la clase abstracta se definen una serie de operaciones básicas (Operaciones Primitivas), estas operaciones básicas pueden ser concretas o abstractas. Cada operación básica corresponde a un paso del algoritmo, y estos pasos se pueden redefinir o implementar en sus subclases. Al mismo tiempo, se implementa un método de plantilla (Template Method) en la clase abstracta para definir el marco de un algoritmo. El método de plantilla no solo puede llamar al método básico implementado en la clase abstracta, sino que también puede llamar al método básico implementado en la subclase de la clase abstracta y también puede llamar al método en otros objetos.
  2. ConcreteClass (subclase concreta): es una subclase de la clase abstracta, que se utiliza para implementar las operaciones básicas abstractas declaradas en la clase principal para completar los pasos del algoritmo específico de la subclase, y también puede cubrir las operaciones básicas concretas ya implementadas en la clase de padres.

2.2, método de plantilla y método básico

Cuando se utiliza el patrón del método de plantilla, existe una colaboración entre los diseñadores de software que desarrollan clases abstractas y los diseñadores de software que desarrollan subclases concretas. Un diseñador es responsable de dar el esquema y el marco de un algoritmo, mientras que otros diseñadores son responsables de dar los diversos pasos lógicos del algoritmo. El método para realizar estos pasos lógicos específicos es el método básico, y el método que combina estos métodos básicos es el método de plantilla, de ahí el nombre del patrón de método de plantilla.

  1. Método de plantilla: un método de plantilla es un método definido en una clase abstracta que combina métodos de operación básicos para formar un algoritmo total o un comportamiento total. Este método de plantilla se define en la clase abstracta y las subclases lo heredan por completo sin modificaciones (en el lenguaje Java, el método de plantilla se puede definir como un método final). El método de plantilla es un método concreto, que brinda un marco lógico de nivel superior, y los pasos de composición lógica pueden ser métodos concretos o métodos abstractos en la clase abstracta. Dado que el método de plantilla es un método concreto, la capa de abstracción en el patrón del método de plantilla solo puede ser una clase abstracta, no una interfaz.
  2. Método básico: El método básico es el método para realizar cada paso del algoritmo, y es una parte integral del método de plantilla. El método básico se puede dividir en tres tipos: método abstracto (Método abstracto), método concreto (Método concreto) y método de gancho (Método de gancho).

(1) Método abstracto: un método abstracto es declarado por una clase abstracta e implementado por sus subclases concretas. Un método abstracto se identifica mediante la palabra clave abstracta en el lenguaje Java.
(2) Método concreto: un método concreto es declarado e implementado por una clase abstracta o una clase concreta, y sus subclases se pueden sobrescribir o heredar directamente.
(3) Método gancho: un método gancho es declarado e implementado por una clase abstracta o una clase concreta, y sus subclases pueden extenderse. Por lo general, la implementación dada en la clase padre es una implementación vacía, y esta implementación vacía se usa como la implementación predeterminada del método. Por supuesto, el método gancho también puede proporcionar una implementación predeterminada no vacía.

En el patrón del método de plantilla, hay dos tipos de métodos de enlace. El primer tipo de método de enlace se puede "enganchar" con algunos pasos específicos para implementar diferentes pasos en el método de plantilla bajo diferentes condiciones. El tipo de retorno de este tipo de método de enlace suele ser de tipo booleano, y el nombre del método generalmente es ×××(), que se utiliza para juzgar una determinada condición. Un paso se ejecuta si se cumple la condición, de lo contrario no se ejecuta. El fragmento de código es el siguiente:

// 模板方法
public void template(){
    
    
  open();
  display();
  if(isPrint()){
    
    
     print();
  }

  // 构子方法
  public boolean isPrint(){
    
    
     return true;
  }
}

En el código anterior, el método isPrint() es el método gancho, que puede determinar si se ejecuta el método print(). En circunstancias normales, el valor de retorno del método de enlace es verdadero. Si no desea que se ejecute un método, puede anular el método de enlace en su subclase y cambiar su valor de retorno a falso. Este tipo de método de enlace puede controlar la ejecución del método e imponer restricciones a un algoritmo.

Otro tipo de método gancho es un método específico cuyo cuerpo de método está vacío.Las subclases pueden anular o heredar estos métodos gancho según sea necesario. Comparado con el método abstracto, la ventaja de este tipo de método gancho es que si la subclase no anula el método gancho definido en la clase principal, la compilación puede pasar normalmente, pero si el método abstracto declarado en la clase principal no está cubierto , la compilación informará de un error.

En el patrón del método plantilla, el código típico de una clase abstracta es el siguiente:

abstract class AbstractClass{
    
    
   // 模板方法
   
   // 基本方法——具体方法
   public void primitiveOperation1(){
    
    
      // 实现代码
   }
   
   // 基本方法——抽象方法
   public abstract void primitiveOperation2();
   
      // 基本方法——构子方法
   public abstract void primitiveOperation3(){
    
    
    
   }
}

En la clase abstracta, el método de plantilla templateMethod () define el marco del algoritmo, y el método básico se llama en el método de plantilla para realizar el algoritmo completo. Cada método básico, como nativeOperation1(), nativeOperation2(), etc., implementa una parte del algoritmo, y los métodos básicos que son iguales para todas las subclases pueden ser implementados por la clase principal, como nativeOperation1(). De lo contrario, se declara como un método abstracto o método gancho en la clase principal, y las diferentes subclases brindan implementaciones diferentes, como la operación primitiva2() y la operaciónprimitiva3().

La implementación de los pasos abstractos se puede proporcionar en la subclase de la clase abstracta, y el método concreto ya implementado en la clase principal también se puede anular. El código típico para una subclase concreta es el siguiente:

public ConcreteClass extends AbstractClass{
    
    
   public void primitiveOperation2(){
    
    
      // 实现代码
   }
   
      public void primitiveOperation3(){
    
    
      // 实现代码
   }
}

En el patrón de método de plantilla, debido al polimorfismo orientado a objetos, el objeto de la subclase anulará el objeto de la clase principal en tiempo de ejecución, y los métodos definidos en la subclase también anularán los métodos definidos en la clase principal. Por lo tanto, cuando el programa se está ejecutando, el método básico de la subclase específica anulará el método básico definido en la clase principal, y el método de enlace de la subclase también anulará el método de enlace de la clase principal, de modo que el método de enlace implementado en la subclase puede actualizar la clase principal.La ejecución del método está restringida para realizar el control inverso de la subclase al comportamiento de la clase principal.

3. Resumen del patrón del método de plantilla

El patrón de método de plantilla es una tecnología de reutilización de código basada en herencia, que incorpora muchas ideas importantes de orientación a objetos y es un patrón con alta frecuencia de uso. El patrón de método de plantilla se usa ampliamente en el diseño de marcos (como Spring, JUnit, etc.) para garantizar que la secuencia lógica del proceso de procesamiento esté controlada por la clase principal (como la inicialización del marco, la configuración de la prueba). proceso, etc).

3.1 Principales ventajas

  1. El patrón del método de plantilla define formalmente un algoritmo en la clase principal y sus subclases implementan los detalles. Cuando una subclase implementa un algoritmo de procesamiento detallado, no cambia el orden de ejecución de los pasos del algoritmo.
  2. El patrón del método de plantilla es una técnica de reutilización de código, que es particularmente importante en el diseño de bibliotecas de clases. Extrae el comportamiento público en la biblioteca de clases, coloca el comportamiento público en la clase principal y realiza diferentes comportamientos a través de sus subclases. Fomenta el uso adecuado de la herencia para la reutilización del código.
  3. El patrón Template Method implementa una estructura de control invertida. La subclase anula el método de enganche de la clase principal para determinar si es necesario ejecutar un paso específico.
  4. En el modo de método de plantilla, las subclases se pueden usar para anular los métodos básicos de la clase principal. Diferentes subclases pueden proporcionar diferentes implementaciones de los métodos básicos. Es muy conveniente reemplazar y agregar nuevas subclases, lo que se ajusta al principio de responsabilidad única. y el principio de apertura y cierre.

3.2 Principales desventajas

La principal desventaja del patrón del método de plantilla es que debe proporcionar una subclase para cada implementación diferente del método base. Si hay demasiados métodos básicos variables en la clase principal, la cantidad de clases aumentará, el sistema será más grande y el diseño será más abstracto. En este punto, se puede diseñar junto con el modo puente.

3.3 Escenarios aplicables

  1. Divida algunos algoritmos complejos, diseñe las partes fijas del algoritmo como métodos de plantilla y métodos específicos de la clase principal, y sus subclases implementen algunos detalles que se pueden cambiar. Es decir, implemente la parte invariable de un algoritmo una vez y deje que las subclases implementen el comportamiento variable.
  2. El comportamiento que es común entre las subclases debe extraerse y centralizarse en una clase principal común para evitar la duplicación de código.
  3. Es necesario determinar si un paso en el algoritmo de la clase principal se ejecuta a través de la subclase, para realizar el control inverso de la subclase a la clase principal.

Supongo que te gusta

Origin blog.csdn.net/YYBDESHIJIE/article/details/132090517
Recomendado
Clasificación