Articulo de referencia

Patrón de método de plantilla

En la programación orientada a objetos , el método plantilla es uno de los patrones de diseño de comportamiento identificados por Gamma et al. [ 1 ] en el libro Design Patterns ...

En la programación orientada a objetos , el método plantilla es uno de los patrones de diseño de comportamiento identificados por Gamma et al. [ 1 ] en el libro Design Patterns . El método plantilla es un método de una superclase, generalmente abstracta, que define la estructura básica de una operación mediante una serie de pasos de alto nivel. Estos pasos son implementados por métodos auxiliares adicionales en la misma clase que el método plantilla .

Los métodos auxiliares pueden ser métodos abstractos , en cuyo caso las subclases deben proporcionar implementaciones concretas, o métodos de enlace , que tienen cuerpos vacíos en la superclase. Las subclases pueden (pero no están obligadas a) personalizar la operación sobrescribiendo los métodos de enlace. El propósito del método plantilla es definir la estructura general de la operación, al tiempo que permite a las subclases refinar o redefinir ciertos pasos. [ 2 ]

Descripción general

Este patrón tiene dos partes principales:

  • El método plantilla se implementa como un método en una clase base (generalmente una clase abstracta ). Este método contiene el código para las partes del algoritmo general que son invariables. La plantilla garantiza que el algoritmo general se siga siempre. [ 1 ] En el método plantilla, las partes del algoritmo que pueden variar se implementan enviando mensajes que solicitan la ejecución de métodos auxiliares adicionales . En la clase base, a estos métodos auxiliares se les asigna una implementación predeterminada o ninguna (es decir, pueden ser métodos abstractos).
  • Las subclases de la clase base "rellenan" las partes vacías o "variantes" de la "plantilla" con algoritmos específicos que varían de una subclase a otra. [ 3 ] Es importante que las subclases no sobrescriban el método de la plantilla en sí.

En tiempo de ejecución, el algoritmo representado por el método plantilla se ejecuta enviando el mensaje plantilla a una instancia de una de las subclases concretas. Mediante herencia, el método plantilla de la clase base comienza a ejecutarse. Cuando el método plantilla se envía un mensaje a sí mismo solicitando uno de los métodos auxiliares, la subinstancia concreta recibe el mensaje. Si el método auxiliar ha sido sobrescrito, se ejecutará la implementación sobrescrita en la subinstancia; de lo contrario, se ejecutará la implementación heredada de la clase base. Este mecanismo garantiza que el algoritmo general siga los mismos pasos siempre, al tiempo que permite que los detalles de algunos pasos dependan de la instancia que recibió la solicitud original para ejecutar el algoritmo.

Este patrón es un ejemplo de inversión de control, ya que el código de alto nivel ya no determina qué algoritmos ejecutar; en su lugar, se selecciona un algoritmo de nivel inferior en tiempo de ejecución.

Algunos de los mensajes que envía el método plantilla pueden dirigirse a métodos de enlace . Estos métodos se implementan en la misma clase base que el método plantilla, pero con cuerpos vacíos (es decir, no realizan ninguna acción). Los métodos de enlace existen para que las subclases puedan sobrescribirlos y, de este modo, ajustar la acción del algoritmo sin necesidad de sobrescribir el método plantilla en sí. En otras palabras, proporcionan un punto de anclaje para implementar variantes.

Estructura

Diagrama de clases UML

Un ejemplo de diagrama de clases UML para el patrón de diseño Método de plantilla. [ 4 ]

En el diagrama de clases UML anterior , define una operación que define el esqueleto (plantilla) de un comportamiento medianteAbstractClasstemplateMethod()

  • implementando las partes invariantes del comportamiento y
  • enviando a sí mismo los mensajes primitive1()y primitive2(), que, debido a que están implementados en SubClass1, permiten que esa subclase proporcione una implementación variante de esas partes del algoritmo.
Método de plantilla en LePUS3 . [ 5 ]

Uso

El método de plantilla se utiliza en los frameworks, donde cada uno implementa las partes invariantes de la arquitectura de un dominio, a la vez que proporciona métodos de enlace para la personalización. Este es un ejemplo de inversión de control . El método de plantilla se utiliza por las siguientes razones. [ 3 ]

  • Permite que las subclases implementen comportamientos variables (mediante la sobrescritura de los métodos de enlace). [ 6 ]
  • Evita la duplicación en el código: el flujo de trabajo general del algoritmo se implementa una sola vez en el método plantilla de la clase abstracta, y las variaciones necesarias se implementan en las subclases. [ 6 ]
  • Controla los puntos en los que se permite la especialización. Si las subclases simplemente sobrescribieran el método de plantilla, podrían realizar cambios radicales y arbitrarios en el flujo de trabajo. En cambio, al sobrescribir únicamente los métodos de enlace, solo se pueden modificar ciertos detalles específicos del flujo de trabajo [ 6 ] , y el flujo de trabajo general permanece intacto.

Utilizar con generadores de código

El patrón de plantilla resulta útil al trabajar con código autogenerado. El desafío de trabajar con código generado radica en que los cambios en el código fuente conllevan cambios en el código generado; si se han realizado modificaciones manuales en el código generado, estas se perderán. Entonces, ¿cómo se debe personalizar el código generado?

El patrón de plantilla proporciona una solución. Si el código generado sigue el patrón de método de plantilla, todo el código generado será una superclase abstracta. Siempre que las personalizaciones escritas manualmente se limiten a una subclase, el generador de código puede ejecutarse de nuevo sin riesgo de sobrescribir estas modificaciones. Cuando se utiliza con la generación de código, este patrón a veces se denomina patrón de brecha generacional . [ 7 ]

Ejemplo de C++

Esta implementación en C++23 se basa en la implementación anterior a C++98 que aparece en el libro.

Método de plantilla Cpp patrón UML.svg

importar std ;usando std :: unique_ptr ;// clase abstracta class View { private : void setFocus ( ) { std :: println ( "View::setFocus llamado" ); }void resetFocus () { std :: println ( "View::resetFocus llamado" ); } public : // define operaciones primitivas abstractas que las subclases concretas definen para implementar los pasos de un algoritmo. virtual void doDisplay () = 0 ;// Implementa un método plantilla que define el esqueleto de un algoritmo. El método plantilla llama a operaciones primitivas, así como a operaciones definidas en AbstractClass o en otros objetos. void display () { setFocus (); doDisplay (); resetFocus (); }virtual ~ Vista () = predeterminado ; };// clase concreta class MyView : public View { public : // implementa las operaciones primitivas para llevar a cabo los pasos específicos de la subclase del algoritmo. void doDisplay () override { // renderiza el contenido de la vista std :: println ( "MyView::doDisplay llamado" ); } };int main ( int argc , char * argv []) { unique_ptr < View > myview = std :: make_unique < MyView > (); myview -> display (); }

La salida del programa es

Vista :: setFocus llamado MyView :: doDisplay llamado Vista :: resetFocus llamado

Véase también

Referencias

  1. 1 2 Gamma, Erich ; Helm, Richard ; Johnson, Ralph ; Vlissides, John (1994). «Método de plantilla». Patrones de diseño . Addison-Wesley. págs. 325–330 . ISBN  0-201-63361-2.
  2. Freeman, Eric; Freeman, Elisabeth; Sierra, Kathy; Bates, Bert (2004). Hendrickson, Mike; Loukides, Mike (eds.). Head First Design Patterns (edición de bolsillo) . Vol. 1. O'REILLY. pp. 289, 311. ISBN   978-0-596-00712-6. Consultado el 12 de septiembre de 2012 .
  3. 1 2 "Patrón de diseño Método de plantilla" . Source Making - enseñanza para profesionales de TI . Consultado el 12 de septiembre de 2012. El método de plantilla se utiliza de forma destacada en los frameworks.
  4. "El patrón de diseño Método de Plantilla - Estructura" . w3sDesign.com . Consultado el 12 de agosto de 2017 .
  5. Leyenda de LePUS3. Obtenido de http://lepus.org.uk/ref/legend/legend.xml .
  6. 1 2 3 Chung, Carlo (2011). Patrones de diseño Pro Objective-C para iOS . Berkeley, CA: Apress. pág. 266. ISBN  978-1-4302-3331-2.
  7. Vlissides, John (22 de junio de 1998). Pattern Hatching: Design Patterns Applied . Addison-Wesley Professional. págs. 85–101 . ISBN  978-0201432930.
  • Seis usos comunes del patrón de plantilla
  • Patrón de diseño de método de plantilla