Uno de los métodos de plantilla de patrones de diseño más útiles

Hoy es el noveno artículo de la serie de aprendizaje de patrones de diseño, que le ofrece un patrón de método de patrón-plantilla de diseño particularmente utilizado .

Partiendo del problema

  1. ¿Qué es el patrón del método de plantilla?
  2. ¿Cuál es el método del gancho que se menciona a menudo? ¿Está relacionado con el método de la plantilla?
  3. El patrón del método de plantilla y el patrón de estrategia parecen un poco similares, ¿cómo distinguirlos?
  4. ¿Manifestación concreta en JDK?

Análisis de patrones

Como siempre, para facilitar la comprensión, partimos de un ejemplo en el desarrollo diario.
Quienes hacen sistemas de seguros saben que existen muchos tipos de seguros, como seguros de propiedad, seguros de vida, seguros de pensiones, seguros de salud, seguros de automóviles, etc. Como desarrollador back-end, al diseñar y desarrollar estos productos de seguros para que estén en línea, primero debemos analizar los puntos comunes de estos procesos de compra de seguros.

El proceso de estos seguros en el momento de la compra del producto es el siguiente (por ejemplo, la situación real es diferente, el proceso central es un secreto de la empresa y debe ser estrictamente confidencial, ¡es broma!):

Seguro de salud, seguro de propiedad, seguro de pensiones, seguro de vida, seguro de automóvil:

  1. Cálculo de prueba premium
  2. Aviso sanitario (no hay seguro de auto, es para revisar la matrícula)
  3. Suscripción
  4. Pago (uniforme)
  5. Suscripción

Se puede ver que el proceso de compra central es muy similar, pero la implementación específica de diferentes tipos de seguros es diferente, como el seguro de salud y el seguro de propiedad, su contenido de notificación de salud es diferente.

Si obtiene algunas implementaciones directas de la clase correspondiente, ciertamente habrá una gran cantidad de código duplicado, si le permite diseñar, ciertamente la primera idea es definir una superclase, el método común en el que el createOrder()método de compra se debe a la subclase Los métodos de llamada de proceso en (seguro de automóvil y seguro de vida) son diferentes, por lo que se definen como abstractos, y luego los métodos de notificación de salud en el ejemplo no son públicos, por lo que se colocan en subclases específicas.

Pero tal diseño aún se puede optimizar, porque el proceso de asegurar y realizar un pedido es básicamente el mismo para cada tipo de seguro.Como para cada tipo de seguro, la realización de cada paso puede ser diferente, podemos abstraerlo. Por ejemplo, la notificación de salud y la inspección de la placa de matrícula se unifican y se resumen en el método check (). Entonces, el nuevo método createOrder () se ve así:

void createOrder() {
    
    
    calculate();
    check();
    underwriting();
    pay();
    accept();
}

Luego implementamos los métodos públicos en la superclase, y luego definimos los diferentes métodos como abstractos y los posponemos a la subclase a implementar, como el método check (), que se coloca en las subclases de seguros de auto y de vida correspondientes para implementar cada uno. De esta forma, se simplifica el código y se realiza la reutilización.

Comprender el método de la plantilla

Básicamente, el ejemplo que acabamos de dar es el patrón del método de plantilla. El createOrder () en la clase base de seguro mencionada anteriormente es nuestro método de plantilla. ¿Porqué es eso?

porque:

  1. Después de todo, es un método;
  2. Se utiliza como plantilla para un algoritmo. En este ejemplo, el algoritmo se utiliza para completar el proceso de solicitud de seguro de propiedad.

En esta plantilla, cada paso del algoritmo está representado por un método. Algunos métodos son manejados por esta clase (es decir, la superclase) y algunos métodos son manejados por subclases. Los métodos que debe proporcionar la subclase deben declararse como abstractos en la superclase.

Definir patrón de método de plantilla

El patrón de método de plantilla define el esqueleto de un algoritmo en un método y retrasa algunos pasos a las subclases. El método de plantilla permite que las subclases redefinan ciertos pasos en el algoritmo sin cambiar la estructura del algoritmo.

Este modo puede garantizar que la estructura del algoritmo permanezca sin cambios y, al mismo tiempo, parte de la implementación la proporcionan las subclases. Veamos el diagrama de clases:

Inserte la descripción de la imagen aquí

Que nos aporta el método de la plantilla

  1. Todo está dominado por la clase AbstractClass y el algoritmo es inmutable;
  2. Para las subclases, la existencia de AbstractClass puede maximizar la reutilización del código;
  3. El algoritmo solo existe en un lugar, por lo que es fácil de modificar;
  4. Este método de plantilla proporciona un marco que permite insertar otras subclases, como agregar otros tipos de seguros, siempre que implemente su propio método;
  5. La clase AbstractClass se centra en el algoritmo en sí, mientras que las subclases proporcionan una implementación completa;

¿Qué es un método de gancho?

Creo que has oído hablar del gancho antes, pero es posible que no lo entiendas todo el tiempo . Es un método declarado en una clase abstracta, pero solo tiene una implementación vacía o predeterminada . La existencia de ganchos permite que las subclases tengan la capacidad de enganchar diferentes puntos del algoritmo. La subclase determina si enganchar o no.

Se usa junto con el método de plantilla. Por ejemplo, el algoritmo de seguro createOrder () que definimos anteriormente asume que se agregará una nueva llamada al método y se cambiará el método de plantilla. Pero este método no necesita ser implementado por todas las subclases. Si desea otorgar la capacidad de esta opción a la selección de subclase, puede definir este método en la superclase como un método vacío o implementación predeterminada. Las subclases pueden optar por anular, pero no Debe hacerse, esto es lo que hacen los ganchos.

¿Cuál es la diferencia entre el método de plantilla y el modo de estrategia?

El modo estrategia fue explicado en nuestro primer artículo, puede haber muchos amigos que no lo hayan recordado, así que aquí está la repetición: el modo estrategia define una familia de algoritmos y permite que estos algoritmos sean intercambiables. Debido a que cada algoritmo está encapsulado, los clientes pueden usar fácilmente diferentes algoritmos.

Aunque ambos encapsulan el algoritmo, la intención es diferente: el trabajo del método de plantilla es definir un esquema de algoritmo, y la subclase define el contenido de algunos de los pasos, lo que puede cambiar los detalles de implementación de pasos individuales, pero la estructura del algoritmo sigue siendo permanecer igual. Sin embargo, el modo de estrategia es utilizar el método de delegación de combinación, que permite a los clientes elegir la implementación del algoritmo a través de la combinación de objetos.

Es decir, el método de la plantilla tiene más control sobre el algoritmo y no repite el código, generalmente es más eficiente y el modo de estrategia es más flexible y flexible.

Método de plantilla alrededor

  1. La ordenación proporcionada por la matriz de Java es un método de plantilla, estático Arrays.sort (Object []). Para la implementación específica, puede ver el código fuente del JDK. En pocas palabras, sort es un método de plantilla, y luego necesitamos personalizar compareTo (). Método, utilizado para "rellenar" los defectos del método de la plantilla;
  2. El núcleo del paquete de concurrencia de Java, AbstactQueuedSynchronizer (AQS para abreviar), el código fuente también se espera que todos verifiquen y verifiquen el método de plantilla aprendido hoy. La descripción simple es que el método de adquisición () proporcionado por él se utiliza para adquirir bloqueos, pero se requieren implementaciones de bloqueo específicas La clase personaliza el método tryAcquire () para completar el proceso de adquisición de bloqueo, es decir, usa este gancho y el algoritmo de adquisición de bloqueo AQS para enganchar, que es muy clásico;

Charla nocturna

  • El "método de plantilla" define los pasos del algoritmo y retrasa la implementación de estos pasos a las subclases;
  • El patrón del método de plantilla nos proporciona una técnica importante para la reutilización de código;
  • La clase abstracta del método de plantilla puede definir métodos concretos, métodos abstractos y ganchos;
  • Los métodos abstractos se implementan por subclases;
  • Un gancho es un método que no hace nada en la clase abstracta, o solo hace cosas predeterminadas, y la subclase puede elegir si lo anula;
  • Para evitar que la subclase cambie el algoritmo en el método de plantilla, el método de plantilla se puede definir como final;
  • Tanto el modo de estrategia como el modo de método de plantilla encapsulan algoritmos, uno usa combinación y el otro usa herencia;
  • El método de fábrica es una versión especial del método de plantilla. La intención original es crear y devolver un objeto;

¡Espero que todos puedan ganar!

Cuenta pública personal

Inserte la descripción de la imagen aquí

  • Los amigos que sienten que están escribiendo bien pueden molestarse en dar me gusta y seguir ;
  • Si el artículo es incorrecto, indíquelo, muchas gracias por leerlo;
  • Recomiendo a todos que presten atención a mi cuenta oficial, y regularmente les enviaré artículos originales de productos secos y los llevaré a la comunidad de aprendizaje de alta calidad;
  • dirección de github : github.com/coderluojust/qige_blogs

Supongo que te gusta

Origin blog.csdn.net/taurus_7c/article/details/107584205
Recomendado
Clasificación