El patrón de método de plantilla del patrón de diseño de Java define el marco de un algoritmo operativo y difiere algunos pasos a las subclases, de modo que las subclases puedan redefinir ciertos pasos específicos en el algoritmo sin cambiar la estructura del algoritmo. Modelo de comportamiento
Como se muestra a continuación:
De hecho, el método de plantilla es un patrón de uso frecuente en programación. Primero veamos un ejemplo. Un día, el programador A recibió una tarea: dada una matriz de números enteros, ordene los números en la matriz de menor a mayor y luego imprima los resultados ordenados. Después del análisis, esta tarea se puede dividir aproximadamente en dos partes: clasificar e imprimir. La función de impresión es fácil de implementar, pero la clasificación es un poco problemática. Pero A tiene una manera de completar primero la función de impresión y encontrar a alguien más para realizar la función de clasificación.
clase abstracta AbstractSort { /** * Ordena la matriz de pequeña a grande * @param array */ protected abstract void sort(int[] public void showSortResult(int[] array){ this.sort(array); System.out.print("Ordenar resultado: "); for (int i = 0; i < array.length; i++){ System.out.printf("%3s", array[i]);
Después de terminar de escribir, A encontró a su colega B que acababa de graduarse y se unió al trabajo recientemente y le dijo: Hay una tarea. Ya escribí la lógica principal. Puedes implementar el resto de la lógica. Entonces le di la clase AbstractSort a B y le pedí a B que escribiera la implementación. B lo tomó y lo miró. Era demasiado simple. Se podía hacer en 10 minutos. El código es el siguiente.
clase ConcreteSort extiende AbstractSort { @Override protected void sort(int[] array){ for(int i=0; i<array.length-1; i++){ selectSort(array, i); ] matriz, int index) { int MinValue = 32767; // Variable de valor mínimo int indexMin = 0 // Variable de índice de valor mínimo int Temp; index; i < array.length; i++) { if (array[i] < MinValue){ // Encuentra el valor mínimo MinValue = array[i] // Almacena el valor mínimo indexMin = } } Temp = array[ index] ; // Intercambia dos valores array[index] = array[indexMin]; array[indexMin] = Temp }}
Después de escribirlo, entréguelo a A y A lo ejecutará:
cliente de clase pública { public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 } // Matriz de datos predeterminada public static void main(String[] args){ AbstractSort; s = nuevo ConcreteSort(); s.showSortResult(a);
Resultados de ejecución:
Clasificación de resultados: 0 1 3 4 5 7 9 10 12 32
Funciona bien. Bien, misión cumplida. Sí, este es el patrón del método de plantilla. La mayoría de los graduados que acaban de ingresar al mundo laboral deberían tener una experiencia similar a B. Para una tarea compleja, las mejores personas de la empresa escribirán la lógica principal y luego escribirán los métodos aparentemente simples en métodos abstractos y los dejarán a otros colegas para que los desarrollen. Esta división del trabajo se utiliza a menudo en empresas con niveles evidentes de personal de programación. Por ejemplo, si un equipo de proyecto tiene un arquitecto, un ingeniero senior y un ingeniero junior, el arquitecto generalmente utilizará una gran cantidad de interfaces y clases abstractas para unir la lógica de todo el sistema, y la codificación de implementación se entregará a el ingeniero senior y el ingeniero junior respectivamente según la dificultad. ¿Qué te parece? ¿Alguna vez has usado el patrón del método de plantilla?
La estructura del patrón del método de plantilla:
El patrón de método de plantilla consta de una clase abstracta y una (o un grupo de) clases de implementación a través de una estructura de herencia. Los métodos de la clase abstracta se dividen en tres tipos:
1. Método abstracto : solo se declara en la clase principal pero no se implementa. En cambio, la especificación se define y luego se implementa mediante sus subclases.
2. Método de plantilla : declarado e implementado por una clase abstracta. En términos generales, los métodos de plantilla llaman a métodos abstractos para completar las funciones lógicas principales, y la mayoría de los métodos de plantilla se definen como tipos finales, lo que indica que las funciones lógicas principales no se pueden anular en subclases.
3. Método de gancho : declarado e implementado por la clase abstracta. Pero las subclases se pueden ampliar y las subclases pueden afectar la lógica de los métodos de plantilla al extender los métodos de enlace.
La tarea de las clases abstractas es construir un marco lógico, que generalmente está escrito por personal experimentado, porque la calidad de las clases abstractas determina directamente la estabilidad del programa.
Las clases de implementación se utilizan para implementar detalles. El método de plantilla en la clase abstracta completa la lógica empresarial implementando el método de extensión de clase. Siempre que el método de extensión en la clase de implementación pase la prueba unitaria y el método de plantilla sea correcto, generalmente no habrá errores importantes en la función general.
Ventajas y escenarios aplicables del método de plantilla:
Fácil de ampliar. En términos generales, el método de plantilla en una clase abstracta es la parte que no es fácil de cambiar retroactivamente, mientras que el método abstracto es la parte que es fácil de cambiar retroactivamente. Por lo tanto, al agregar clases de implementación, generalmente es fácil expandir la función. , que está en línea con el principio de apertura y cierre.
Fácil de mantener. Para el patrón de método de plantilla, es precisamente porque su lógica principal es la misma que se utiliza el método de plantilla. Si no se utiliza el método de plantilla, se permite que el mismo código se distribuya en diferentes clases, lo cual es muy inconveniente de mantener. .
Más flexible. Debido al método de enlace, la implementación de la subclase también puede afectar el funcionamiento de la lógica principal en la clase principal. Sin embargo, si bien es flexible, debido a que la subclase afecta a la clase principal, viola el principio de sustitución de Liskov y también conlleva riesgos para el programa. Esto impone mayores requisitos al diseño de clases abstractas.
Cuando varias subclases tienen el mismo método y la lógica de estos métodos es la misma, puede considerar usar el patrón de método de plantilla. Este modo también es más adecuado para situaciones en las que el marco principal del programa es el mismo pero los detalles son diferentes.