Pregunta

¿Alguien puede darme algunas situaciones de ejemplo en las que se debería utilizar el método de plantilla - patrón?

Dame un uso en el mundo real de tu propia experiencia.

(Hasta ahora lo he encontrado útil solo para mapear datos en la capa DA.¡¡¡Lo siento!!!)

¿Fue útil?

Solución

He intentado darle algunos ejemplos del mundo real, y algunas situaciones comunes donde Template Method se debe utilizar.

  • Cuando usted quiere que su programa sea "abierto para la extensión” y ‘Cerrado por modificación’. Esto significa que el comportamiento del módulo se puede extender, de manera que podemos hacer el se comportan módulo en nuevas y diferentes maneras como los requisitos del cambio de la aplicación, o para satisfacer las necesidades de nuevas aplicaciones. Sin embargo, el código fuente de un módulo de este tipo es inviolable. Nadie está autorizado a realizar cambios en el código fuente de la misma. en siguiente ejemplo, se puede añadir nuevo método de cálculo de salario (como la clase de forma remota) sin cambiar los códigos anteriores.

    public abstract class Salary {
    
       public final void calculate() {
            System.out.println("First shared tasks is done.");
            getBaseSalary();
            System.out.println("Second shared tasks is done.");
       }
    
       public abstract void getBaseSalary();
    
    }
    
    public class Hourly extends Salary {
    
        @Override
        public void getBaseSalary() {
            System.out.println("Special Task is done.");
        }
    
    }
    
    public class Test {
    
        public static void main(String[] args) {
            Salary salary = ....
            salary.calculate();
        }
    }
    
  • Cuando se enfrentan a muchas misma línea de los códigos que se duplican a través difiriendo sólo algunos pasos de su algoritmo. Cuando se está implementando el contenido de un método o función que puede encontrar alguna sección de su código que varían de un tipo a otro tipo. La característica de esta secciones son que uno puede redefinir o modificar estas secciones de un método o función sin cambiar (método o función) de la algoritmo de estructura principal. Por ejemplo, si se quiere resolver este problema sin este patrón que se enfrentará a este ejemplo:

function0: function1: ... functionN:

1       1               1
2       2               2
...     ...             ...
5       6               n
3       3               3
4       4               4
...     ...             ...

Como se puede ver, la sección bacalaos 5, 6, n son diferentes puede variar de una función a otra función, sin embargo, las secciones que han compartido como 1,2,3,4 que se duplican. Vamos a considerar una solución con una de las bibliotecas de Java famosos.

public abstract class InputStream implements Closeable {

    public abstract int read() throws IOException;

    public int read(byte b[], int off, int len) throws IOException {
        ....

        int c = read();
        ....
    }

    ....

}

public class ByteArrayInputStream extends InputStream {  

    ...

    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
        }
    ...
}
  • Cuando como diseñador de un marco, quiere que sus clientes sólo para utilizar cualquier código ejecutable que se pasa como argumento a su marco, que se espera para volver a llamar (ejecutar) que el argumento en un tiempo determinado. Esta ejecución puede ser inmediata como en una devolución de llamada síncrona, o podría suceder en un momento posterior como en una devolución de llamada asincrónica. Vamos a considerar uno de los famosos.

    public abstract class HttpServlet extends GenericServlet 
        implements java.io.Serializable  {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
            ...
        }
    
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
            ....
            doGet(req, resp);
            ...
        }
        ...
    }
    }
    
    public class MyServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    
                //do something
            ...
        }
        ...
    }
    

Otros consejos

A Plantilla patrón método proporciona un esqueleto para realizar cualquier tipo de algoritmo o una operación, y permite que las subclases para volver a definir parte de la lógica.

Pros: Ajuste natural para marcos de construcción, por lo que las clases marco de los padres pueden hacer devoluciones de llamada a métodos implementados en niños

.

Ejemplos:

  • java.util.AbstractList
  • métodos
  • doGet y doPost de servlet
  • onMessage método de MDB
  • clase Struts Acción
  • clases de acceso a datos de la primavera

Contras:. Le restringe a una sola herencia en Java

Una aplicación de la Método de plantilla El patrón tiene dos características principales:

  1. Hay una clase base (en Java, solo una con protected constructores y opcionalmente declarados como abstract) que se subclasificará en el código del cliente.
  2. Hay dos grupos de métodos definido en la clase base:a) uno o más métodos de plantilla (normalmente sólo uno) y uno o más operación primitiva métodos (normalmente más de uno).Cada método de plantilla representa una operación de alto nivel, implementada en la propia clase base en términos de operaciones primitivas, que deben implementarse/anularse en cada subclase específica.Normalmente, el método de plantilla es público y no anulable (final, en Java);su documentación API debe especificar con precisión qué métodos de operación primitivos llama y cuándo (es decir, debe describir el "algoritmo").Un método de operación primitivo, que representa un paso en el algoritmo, no debe ser público pero debe ser anulable (protected, en Java), y pueden ser de dos tipos:a) un método abstracto que debe implementarse en la subclase;b) un método con una implementación predeterminada/vacía que puede ser anulado en la subclase.

Un buen ejemplo en el SDK de Java 6 es el execute() método de la javax.swing.SwingWorker clase (es un public final void método).En este caso, los métodos de operación primitivos son doInBackground(), process(List), y done().El primero es abstracto y por tanto requiere una implementación en la subclase;se llama mediante el método de plantilla en un hilo en segundo plano.Los otros dos tienen implementaciones vacías y, opcionalmente, pueden anularse en la subclase;se llaman durante y al final del procesamiento, respectivamente, en el EDT (el subproceso de envío de eventos Swing), para permitir actualizaciones de la interfaz de usuario.

En mi propia experiencia, algunas veces he usado este patrón.Uno de esos casos fue una clase base de Java que implementaba el java.util.Iterator interfaz, donde next() era el método de plantilla y solo había un método de operación primitivo responsable de crear una instancia de una clase de entidad de dominio específica (esto estaba destinado a usarse al iterar sobre una lista de objetos de entidad de dominio persistentes, usando JDBC).Un mejor ejemplo en esa misma aplicación fue una clase base donde el método de plantilla implementó un algoritmo de varios pasos destinado a llenar una "pantalla de mantenimiento de entidades comerciales" (usando Swing) a partir de una lista determinada de entidades persistentes;se llamaron métodos de operaciones primitivos para 1) borrar el estado actual de la pantalla y 2) agregar una entidad en una vista de tabla dentro de la pantalla;Opcionalmente, se llamaban otras operaciones primitivas desde el método de plantilla si la pantalla era editable.

Al final, debo decir que aunque este es ciertamente un patrón de diseño útil, no surge muy a menudo una situación en la que realmente sea aplicable.Simplemente tener una clase base con métodos que se anulan en una subclase (una situación mucho más común, en mi experiencia) no es suficiente, por sí solo, para calificar como una aplicación del patrón.

Lo más importante en el método de la plantilla es que usted tiene que definir una serie de métodos abstractos como pasos o un algoritmo y dejar que el sustituto subclase con la aplicación concreta de esos métodos.

He aplicado en uno de los programas de generación de documentos.

public abstract DocumentGenerator() 
{
   generateHeader();
   generateBody();
   generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
   public override generateBody()
   {
     //generate as in html format
   }
}

Usted puede tener diferentes aplicación como generador de csv generador de PDF y el valor aquí es que Comform al algoritmo (generar -> cabecera, cuerpo, detalles).

A patrón de plantilla se debe utilizar cuando hay un algoritmo con muchas implementaciones. El algoritmo se define en función de la clase de base y la aplicación se realiza mediante la clase base y subclases. Una explicación detallada con un ejemplo en tiempo real se da en http://preciselyconcise.com/design_patterns/templatemethod.php

Voy a esbozar un ejemplo del mundo real, donde utilicé algunos métodos de plantilla.

En una aplicación de algoritmo de visión por ordenador C ++ el comportamiento del algoritmo fue diseñado para asumir un par de sabores de comportamiento algoritmo sobre la base de algunas de las opciones de lectura en tiempo de ejecución de acuerdo con una enumeración metida en un archivo de configuración cargado en el arranque. El esqueleto general del algoritmo es idéntico excepto por algunas devoluciones de llamada clave de peluche en el medio de lo que sería una sección idéntica de código que se duplica brutalmente simplemente para llamar a diferentes funciones en ese nivel. Estas devoluciones de llamada que quería utilizar se resumieron en la clase base método de la plantilla y el Template Method prevenir todo lo que la duplicación de código. La enumeración se utilizó básicamente dictó lo que crea una instancia subclase mi puntero de clase base para que apunte a prestar y por lo tanto el algoritmo de su bit asociado de sabor en el comportamiento.

Ahora algunas de las motivaciones detrás de esta variedad de sabores del algoritmo utilizado fue una línea vs funcionalidad fuera de línea de software que controla nuestro instrumento. El sabor desconectado tiró con más rica de depuración / salida de diagnóstico y se mantiene un sistema de coordenadas local para algunos píxeles de la imagen, mientras que el sabor en línea mantuvo las cosas en un espacio de coordenadas absoluta y mantenida preocupaciones específicas para el instrumento funcionando con todas sus robótica y lo que no. Otra enumeración ha hecho una selección entre un conjunto de clasificadores que utilizamos para un aprendizaje de máquina, así ya que diferentes clasificadores fueron entrenados bajo diferentes conjuntos de datos que de otra manera fluyó de forma idéntica a través del cuerpo del código, pero necesitan ser interpretados de manera diferente sobre la base de algunas de las normas de cómo fue creado esos datos.

Creo que este tipo de casos de uso que tenía surgió a partir de lo que se ha llamado el agujero en el problema medio.

He utilizado el método de la plantilla de la lógica de negocios donde un número de componentes comparte el mismo proceso pero la aplicación era ligeramente diferente.

  

El método plantilla define la estructura de esqueleto de un algoritmo pero   difiere ciertos pasos y detalles a las subclases. La estructura y la   flujo del algoritmo permanece estático, pero los detalles de los pasos son   diferido a las subclases.

utilicé Template Method para preparar el contenido del documento. Había muchos tipos diferentes de documentos que cada tipo tiene sus propias pequeñas modificaciones. Sin embargo, el principal proceso de preparación de documentos era igual para todos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top