stringtranslate.com

Patrón de método de plantilla

En 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 Patrones de diseño . El método de plantilla es un método de una superclase, normalmente 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 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 hacerlo) 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 que las subclases refinen o redefinan 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 uno mismo solicitando uno de los métodos auxiliares, el mensaje será recibido por la subinstancia concreta. Si se ha anulado el método auxiliar, se ejecutará la implementación anulada en la subinstancia; si no se ha anulado, se ejecutará la implementación heredada en la clase base. Este mecanismo garantiza que el algoritmo general siga los mismos pasos cada vez y 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 su lugar, se selecciona un algoritmo de nivel inferior en tiempo de ejecución.

Algunos de los automensajes enviados por el método de plantilla pueden ser métodos de enlace . 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 enlace 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" del cual "colgar" implementaciones variantes.

Estructura

diagrama de clases UML

Un diagrama de clases UML de muestra para el patrón de diseño del 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 marcos, donde cada uno implementa las partes invariantes de la arquitectura de un dominio, al tiempo 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]

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 darán lugar a cambios en el código generado; Si se han realizado modificaciones escritas a mano en el código generado, estas se perderán. Entonces, ¿cómo se debe personalizar el código generado?

El patrón Plantilla proporciona una solución. Si el código generado sigue el patrón del método de plantilla, 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 nuevamente 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

#incluir <iostream> #incluir <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. visualización nula () { setFocus (); hacerDisplay (); restablecerenfoque (); } virtual ~ Ver () = predeterminado ; privado : void setFocus () { std :: cout << "Ver::setFocus \n " ; } void resetFocus () { std :: cout << "Ver::resetFocus \n " ; } };                                  class MyView : public View { // ConcreteClass // implementa las operaciones primitivas para llevar a cabo pasos del algoritmo específicos de subclases. void doDisplay () override { // renderiza el contenido de la vista std :: cout << "MyView::doDisplay \n " ; } };                int main () { // Los punteros inteligentes evitan pérdidas de memoria std :: unique_ptr < View > myview = std :: make_unique < MyView > (); mivista -> mostrar (); }        

La salida del programa es

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

Ver también

Referencias

  1. ^ ab Gamma, Erich ; Timón, 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. ^ Hombre libre, Eric; Hombre libre, 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. Consultado el 12 de septiembre de 2012 .
  3. ^ ab "Patrón de diseño de método de plantilla". Creación de fuentes: enseñanza de profesionales de TI . Consultado el 12 de septiembre de 2012 . El método de plantilla se utiliza de forma destacada en los marcos.
  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. Obtenido 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. pag. 266.ISBN 978-1-4302-3331-2.
  7. ^ Vlissides, John (22 de junio de 1998). Eclosión de patrones: patrones de diseño aplicados. Profesional de Addison-Wesley. págs. 85-101. ISBN 978-0201432930.

enlaces externos