Template Method (padrón de deseño): Diferenzas entre revisións

Contido eliminado Contido engadido
Sen resumo de edición
Liña 1:
Dentro do marco da [[programación orientada a obxectos]], o patrón '''Template Method''' (''Método Plantilla'' ou ''Método Modelo'' en galego) é un [[patrón de deseño]] enmarcado dentro dos chamados [[patrón de deseño#patróns de comportamento|patróns de comportamento]], que se caracteriza pola definición, dentro dunha operación dunha superclase, dos pasos dun algoritmo, de forma que todos ou parte destes pasos son redefinidos nas subclases herdeiras da citada superclase.<br /><br />
 
== <big>Propósito</big> ==
Permitir que certos pasos dun algoritmo definido nunha operación dunha superclase, sexan redefinidos nas subclases sen necesidade de ter que sobrescribir a operación enteira.<br /><br />
 
== <big>Aplicabilidade</big> ==
A utilización do patrón '''Método Plantilla''' é axeitada nos seguintes casos:
:* Cando contamos cun algoritmo con varios pasos que non cambian, de modo que ditos pasos invariantes serían implementados nunha superclase, deixando a implementación dos pasos que cambian para as subclases.
:* Para evitar a replicación de código mediante '''xeneralización''': factorízase o comportamento común de varias subclases nunha única superclase.
:* Para controlar as extensións das subclases. O '''Método Plantilla''' utiliza métodos especiais (''métodos de enganche'' ou ''hooks'') en certos puntos, sendo os únicos puntos que poden ser redefinidos e, por tanto, os únicos puntos onde é posible a extensión.<br /><br />
 
== <big> Estrutura <big/> ==
Móstrase de seguido a estrutura que segue o patrón '''Método Plantilla''': <br /><br />
[[Ficheiro:Estrutura MetodoPlantilla.png|center|Estrutura do patrón ''Método Plantilla'']]
 
== <big> Participantes <big/> ==
* '''Clase Abstracta''': proporciona a definición dunha serie de operacións primitivas (normalmente abstractas) que implementan os pasos dun algoritmo e que serán definidas nas subclases.
: Encárgase tamén da implementación dun método desde o cal son invocadas, entre outras, as operacións primitivas. Dito método actúa a modo de plantilla, de aí o nome deste patŕon, definindo a secuencia de operacións dun algoritmo.
* '''Clase Concreta''': implementa as operacións primitivas definidas na clase abstracta da cal herda, quedando así determinado o comportamento específico do algoritmo definido no método plantilla, para cada subclase.<br /><br />
 
: Encárgase tamén da implementación dun método desde o cal son invocadas, entre outras, as operacións primitivas. Dito método actúa a modo de plantilla, de aí o nome deste patŕon, definindo a secuencia de operacións dun algoritmo.
== <big> Colaboracións <big/> ==
* '''Clase Concreta''': implementa as operacións primitivas definidas na clase abstracta da cal herda, quedando así determinado o comportamento específico do algoritmo definido no método plantilla, para cada subclase.<br /><br />
As clases concretas baséanse na clase abstracta para implementar a parte invariante do algoritmo.<br /><br />
 
== <big> ConsecuenciasColaboracións <big/> ==
As clases concretas baséanse na clase abstracta para implementar a parte invariante do algoritmo.<br /><br />
 
== Consecuencias ==
* A utilización deste patrón é fundamental á hora de reutilizar código.
* InvírteseInvértese o control: neste caso a superclase é a encargada de chamar ás operacións definidas nas subclases.
* Distinción entre:
:* Operacións primitivas (implementadas nas subclases)
:* Operacións de ''enganche'' ou ''hooks'' (proporcionan un código por defecto que pode ser refinado nas subclases).<br /><br />
 
Cómpre destacar que os métodos plantilla xogan un papel clave nas bibliotecas de clases xa que permiten extraer o comportamento común das clases da biblioteca. Outro uso común deste patrón dase na creación de sistemas de ''plugins'' grazas principalmente á utilización das anteriormente citadas ''operacións de enganche'' (''hooks'').<br /><br />
 
== <big> Implementación <big/> ==
Á hora de proceder a implementar este patrón, resulta de interese ter en conta os seguintes detalles:
* É recomendable declarar as operacións primitivas de tal xeito que só podan ser chamadas polo método plantilla (protected se se traballa coa linguaxe de programación Java)
* Debe reducirse na medida do posible o número de operacións primitivas que van ser invocadas desde o método plantilla. Deste xeito reducirase a complexidade das subclases e resultará menos tediosa a súa implementación.<br /><br />
 
== <big> Exemplo de implementación <big/> ==
Amósase de seguido un exemplo de implementación do patrón Método Plantilla. Nel inténtase ilustrar a grandes rasgos o modo de desprazamento dun automóbil que, basicamente, pode simplificarse en: acelerar, cambiar de marcha e frear. O proceso de acelerar e frear pódese considerar que é idéntico en todos os automóbiles, sen embargo a forma de cambiar de marcha varia duns a outros segundo sexan autos con cambio manual ou autos con cambio automático. <br />
Dacordo con esto, podemos considerar unha superclase ''Automobil'' na cal se define un método plantilla ''Desprazar'' desde o cal se chama á operación primitiva ''CambiarMarcha'' que é implementada dun xeito na subclase "AutomobilManual", e doutro xeito na subclase "AutomobilAutomatico".<br />
 
[[Ficheiro:Exemplo metodoPlantilla.png|center|Exemplo do patrón Método Plantilla]]<br />
 
[[Ficheiro:Exemplo metodoPlantilla.png|center|Exemplo do patrón Método Plantilla.]]<br />
<source lang ="java">
 
 
<big><source lang ="java">
public abstract class Automobil
{
Liña 80 ⟶ 83:
}
}
</source><br /><br /><br /big>
 
 
== <big> Patróns relacionados <big/> ==
O patrón '''Método Plantilla''' adoita relacionarse cos patróns de deseño:
* '''[[Strategy (patrón de deseño)|Estratexia]]'''
:* os métodos plantilla usan a herencia para variar o comportamento dun algoritmo. No caso do '''Patrón Estratexia''' úsase delegación e modificase o algoritmo enteiro.
* '''[[Factory Method (patrón de deseño)|Métodos de fabricación]]'''
:* Os métodos de fabricación adoitan ser chamados desde os métodos plantilla.<br /><br />
 
 
==Véxase tamén==
===Bibliografía===
*{{cita libro |autor= E. Gamma, R. Helm, R. Johnson and J. Vlissides |título= Design Patterns: elements of reusable object-oriented software |ano= 1994 |publicación=Addison-Wesley}}
 
[[Categoría:Patróns de deseño]]
 
{{seniw}}