stringtranslate.com

Patrón de método de plantilla

En la programación orientada a objetos , el método de 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 de plantilla es un método en una superclase, generalmente una superclase abstracta, y define el esqueleto de una operación en términos de una serie de pasos de alto nivel. Estos pasos se implementan a su vez mediante métodos auxiliares adicionales en la misma clase que el método de plantilla .

Los métodos auxiliares pueden ser métodos abstractos , en cuyo caso se requieren subclases para 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 anulando los métodos de enlace. La intención del método de 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:

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

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

Algunos de los mensajes propios enviados por el método de plantilla pueden ser para métodos de gancho . Estos métodos se implementan en la misma clase base que el método de plantilla, pero con cuerpos vacíos (es decir, no hacen nada). Los métodos de gancho existen para que las subclases puedan anularlos y, por lo tanto, puedan ajustar la acción del algoritmo sin la necesidad de anular el método de plantilla en sí. En otras palabras, proporcionan un "gancho" en el que "colgar" implementaciones variantes.

Estructura

Diagrama de clases UML

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

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

Método de plantilla en LePUS3. [5]

Uso

El método de plantilla se utiliza en los marcos, donde cada uno implementa las partes invariables de la arquitectura de un dominio, al tiempo que proporciona métodos de enganche 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]

Usar con generadores de código

El patrón de plantilla es útil cuando se trabaja con código generado automáticamente. El desafío de trabajar con código generado es que los cambios en el código fuente generarán cambios en el código generado; si se han realizado modificaciones escritas a mano en el código generado, estas se perderán. ¿Cómo se debe personalizar entonces el código generado?

El patrón Template proporciona una solución. Si el código generado sigue el patrón del método template, todo el código generado será una superclase abstracta. Siempre que las personalizaciones escritas a mano se limiten a una subclase, el generador de código se puede ejecutar 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 de C++14 se basa en la implementación anterior a C++98 del libro.

Patrón de método de plantilla Cpp UML.svg

#include <iostream> #include <memoria>  class View { // AbstractClass public : // define operaciones primitivas abstractas que las subclases concretas definen para implementar los pasos de un algoritmo. virtual void doDisplay () {} // implementa un método de plantilla que define el esqueleto de un algoritmo. El método de plantilla llama a operaciones primitivas, así como a operaciones definidas en AbstractClass o las de otros objetos. void display () { setFocus (); doDisplay (); resetFocus (); } virtual ~ View () = default ; private : void setFocus () { std :: cout << "View::setFocus \n " ; } void resetFocus () { std :: cout << "View::resetFocus \n " ; } };                                  class MyView : public View { // ConcreteClass // 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 :: cout << "MyView::doDisplay \n " ; } };                int main () { // Los punteros inteligentes evitan fugas de memoria std :: unique_ptr < View > myview = std :: make_unique < MyView > (); myview -> display (); }        

La salida del programa es

Ver :: setFocus MyView :: doDisplay Ver :: resetFocus

Véase también

Referencias

  1. ^ ab 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.). Patrones de diseño Head First (libro de bolsillo) . Vol. 1. O'REILLY. págs. 289, 311. ISBN 978-0-596-00712-6. Recuperado el 12 de septiembre de 2012 .
  3. ^ ab "Patrón de diseño del método de plantilla". Fuente: creación de código para profesionales de TI . Consultado el 12 de septiembre de 2012. El método de plantilla se utiliza de forma destacada en los marcos de trabajo.
  4. ^ "El patrón de diseño del método de plantilla - Estructura". w3sDesign.com . Consultado el 12 de agosto de 2017 .
  5. ^ Leyenda de LePUS3. Recuperado de http://lepus.org.uk/ref/legend/legend.xml.
  6. ^ abc 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). Trama de patrones: patrones de diseño aplicados. Addison-Wesley Professional. págs. 85-101. ISBN 978-0201432930.

Enlaces externos