Patrón de diseño de método de plantilla

El patrón de diseño del método de plantilla es definir un algoritmo como un esqueleto de operaciones y dejar que las clases secundarias implementen los detalles. La estructura general y la secuencia del algoritmo son conservadas por la clase principal. 
Plantilla significa formato preestablecido como plantillas HTML que tienen un formato preestablecido fijo. De manera similar, en el patrón del método de plantilla, tenemos un método de estructura preestablecido llamado método de plantilla que consta de pasos. Estos pasos pueden ser un método abstracto que será implementado por sus subclases.
Este patrón de diseño de comportamiento es uno de los más fáciles de entender e implementar. Este patrón de diseño se usa popularmente en el desarrollo de marcos. Esto también ayuda a evitar la duplicación de código.
 

Fuente: Wikipedia
 

  • AbstractClass contiene templateMethod() que debe ser definitivo para que no se pueda anular. Este método de plantilla hace uso de otras operaciones disponibles para ejecutar el algoritmo, pero está desacoplado para la implementación real de estos métodos. Todas las operaciones utilizadas por este método de plantilla se vuelven abstractas, por lo que su implementación se difiere a las subclases.
  • ConcreteClass implementa todas las operaciones requeridas por templateMethod que fueron definidas como abstractas en la clase padre. Puede haber muchas clases concretas diferentes.

Veamos un ejemplo del patrón del método template. 
 

Java

abstract class OrderProcessTemplate
{
    public boolean isGift;
 
    public abstract void doSelect();
 
    public abstract void doPayment();
 
    public final void giftWrap()
    {
        try
        {
            System.out.println("Gift wrap successful");
        }
        catch (Exception e)
        {
            System.out.println("Gift wrap unsuccessful");
        }
    }
 
    public abstract void doDelivery();
 
    public final void processOrder(boolean isGift)
    {
        doSelect();
        doPayment();
        if (isGift) {
            giftWrap();
        }
        doDelivery();
    }
}
 
 
class NetOrder extends OrderProcessTemplate
{
    @Override
    public void doSelect()
    {
        System.out.println("Item added to online shopping cart");
        System.out.println("Get gift wrap preference");
        System.out.println("Get delivery address.");
    }
 
    @Override
    public void doPayment()
    {
        System.out.println
                   ("Online Payment through Netbanking, card or Paytm");
    }
 
    @Override
    public void doDelivery()
    {
        System.out.println
                    ("Ship the item through post to delivery address");
    }
 
}
 
class StoreOrder extends OrderProcessTemplate
{
 
    @Override
    public void doSelect()
    {
        System.out.println("Customer chooses the item from shelf.");
    }
 
    @Override
    public void doPayment()
    {
        System.out.println("Pays at counter through cash/POS");
    }
 
    @Override
    public void doDelivery()
    {
        System.out.println("Item delivered to in delivery counter.");
    }
 
}
 
class TemplateMethodPatternClient
{
    public static void main(String[] args)
    {
        OrderProcessTemplate netOrder = new NetOrder();
        netOrder.processOrder(true);
        System.out.println();
        OrderProcessTemplate storeOrder = new StoreOrder();
        storeOrder.processOrder(true);
    }
}

Producción : 
 

Item added to online shopping cart
Get gift wrap preference
Get delivery address.
Online Payment through Netbanking, card or Paytm
Gift wrap successful
Ship the item through post to delivery address

Customer chooses the item from shelf.
Pays at counter through cash/POS
Gift wrap successful
Item delivered to in delivery counter.

El ejemplo anterior trata del flujo de procesamiento de pedidos. La clase OrderProcessTemplate es una clase abstracta que contiene el esqueleto del algoritmo. Como se muestra en la nota, processOrder() es el método que contiene los pasos del proceso. Tenemos dos subclases NetOrder y StoreOrder que tienen los mismos pasos de procesamiento de pedidos.
Entonces, el algoritmo general utilizado para procesar un pedido se define en la clase base y es utilizado por las subclases. Pero la forma en que se realizan las operaciones individuales varía según la subclase.
 

Cuándo usar el método de la plantilla

El método de plantilla se usa en marcos, donde cada uno implementa las partes invariables de la arquitectura de un dominio, dejando «marcadores de posición» para las opciones de personalización.
El método de la plantilla se utiliza por las siguientes razones: 

  • Deje que las subclases implementen un comportamiento variable (a través de la anulación de métodos)
  • Evite la duplicación en el código, la estructura general del flujo de trabajo se implementa una vez en el algoritmo de la clase abstracta y las variaciones necesarias se implementan en las subclases.
  • Controle en qué puntos se permite la subclasificación. A diferencia de una anulación polimórfica simple, en la que el método base se reescribiría por completo y permitiría un cambio radical en el flujo de trabajo, solo se permite cambiar los detalles específicos del flujo de trabajo.

Lectura adicional: método de plantilla en Python
Referencia: 
Wikipedia
Este artículo es una contribución de Saket Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *