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

Na Galipedia, a Wikipedia en galego.
Contido eliminado Contido engadido
Elisardojm (conversa | contribucións)
arranxiños
m Bot: Substitución da categoría "Patróns de deseño" pola categoría "Padróns de deseño"; cambios estética
Liña 10: Liña 10:
* Para controlar as extensións das subclases. O '''Método Modelo''' 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.
* Para controlar as extensións das subclases. O '''Método Modelo''' 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.


== Estrutura ==
== Estrutura ==
Móstrase de seguido a estrutura que segue o patrón '''Método Modelo'''
Móstrase de seguido a estrutura que segue o patrón '''Método Modelo'''
[[Ficheiro:Estrutura MetodoPlantilla.png|centro|Estrutura do patrón ''Método Modelo'']]
[[Ficheiro:Estrutura MetodoPlantilla.png|centro|Estrutura do patrón ''Método Modelo'']]


== Participantes ==
== Participantes ==
* '''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.
* '''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.


Liña 20: Liña 20:
* '''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 modelo, para cada subclase.
* '''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 modelo, para cada subclase.


== Colaboracións ==
== Colaboracións ==
As clases concretas baséanse na clase abstracta para implementar a parte invariante do algoritmo.
As clases concretas baséanse na clase abstracta para implementar a parte invariante do algoritmo.


== Consecuencias ==
== Consecuencias ==
* A utilización deste patrón é fundamental á hora de reutilizar código.
* A utilización deste patrón é fundamental á hora de reutilizar código.
* Invértese o control: neste caso a superclase é a encargada de chamar ás operacións definidas nas subclases.
* Invértese o control: neste caso a superclase é a encargada de chamar ás operacións definidas nas subclases.
Liña 32: Liña 32:
Cómpre destacar que os métodos modelo 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'').
Cómpre destacar que os métodos modelo 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'').


== Implementación ==
== Implementación ==
Á hora de proceder a implementar este patrón, resulta de interese ter en conta os seguintes detalles
Á 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 modelo (protected se se traballa coa linguaxe de programación Java)
* É recomendable declarar as operacións primitivas de tal xeito que só podan ser chamadas polo método modelo (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 modelo. Deste xeito reducirase a complexidade das subclases e resultará menos tediosa a súa implementación.
* Debe reducirse na medida do posible o número de operacións primitivas que van ser invocadas desde o método modelo. Deste xeito reducirase a complexidade das subclases e resultará menos tediosa a súa implementación.


== Exemplo de implementación ==
== Exemplo de implementación ==
Amósase de seguido un exemplo de implementación do patrón Método Modelo. Nel inténtase ilustrar a grandes trazos 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.
Amósase de seguido un exemplo de implementación do patrón Método Modelo. Nel inténtase ilustrar a grandes trazos 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.
Dacordo con esto, podemos considerar unha superclase ''Automobil'' na cal se define un método modelo ''Desprazar'' desde o cal se chama á operación primitiva ''CambiarMarcha'' que é implementada dun xeito na subclase "AutomobilManual", e doutro xeito na subclase "AutomobilAutomatico".
Dacordo con esto, podemos considerar unha superclase ''Automobil'' na cal se define un método modelo ''Desprazar'' desde o cal se chama á operación primitiva ''CambiarMarcha'' que é implementada dun xeito na subclase "AutomobilManual", e doutro xeito na subclase "AutomobilAutomatico".
Liña 86: Liña 86:




== Patróns relacionados ==
== Patróns relacionados ==
O patrón '''Método Modelo''' adoita relacionarse cos patróns de deseño
O patrón '''Método Modelo''' adoita relacionarse cos patróns de deseño
* '''[[Strategy (patrón de deseño)|Estratexia]]'''
* '''[[Strategy (patrón de deseño)|Estratexia]]'''
Liña 93: Liña 93:
* Os métodos de fabricación adoitan ser chamados desde os métodos modelo.
* Os métodos de fabricación adoitan ser chamados desde os métodos modelo.


==Véxase tamén==
== Véxase tamén ==
===Bibliografía===
=== 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}}
* {{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]]
[[Categoría:Padróns de deseño]]

Revisión como estaba o 2 de novembro de 2016 ás 14:52

Dentro do marco da programación orientada a obxectos, o patrón Template Method (Método Modelo) é un patrón de deseño enmarcado dentro dos chamados 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.

Propósito

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.

Aplicabilidade

A utilización do patrón Método Modelo é 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 Modelo 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.

Estrutura

Móstrase de seguido a estrutura que segue o patrón Método Modelo

Estrutura do patrón Método Modelo
Estrutura do patrón Método Modelo

Participantes

  • 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 modelo, 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 modelo, para cada subclase.

Colaboracións

As clases concretas baséanse na clase abstracta para implementar a parte invariante do algoritmo.

Consecuencias

  • A utilización deste patrón é fundamental á hora de reutilizar código.
  • Invé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).

Cómpre destacar que os métodos modelo 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).

Implementación

Á 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 modelo (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 modelo. Deste xeito reducirase a complexidade das subclases e resultará menos tediosa a súa implementación.

Exemplo de implementación

Amósase de seguido un exemplo de implementación do patrón Método Modelo. Nel inténtase ilustrar a grandes trazos 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. Dacordo con esto, podemos considerar unha superclase Automobil na cal se define un método modelo Desprazar desde o cal se chama á operación primitiva CambiarMarcha que é implementada dun xeito na subclase "AutomobilManual", e doutro xeito na subclase "AutomobilAutomatico".


Exemplo do patrón Método Modelo.
Exemplo do patrón Método Modelo.


public abstract class Automobil
{
    public void desprazar()
    {
        acelerar();
        cambiarMarcha();
        frear();
    }

    private void acelerar()
    {
        System.out.println("Acelerando...");
    }

    private void frear()
    {
        System.out.println("Freando...");
    }

    protected abstract void cambiarMarcha()
}

public class AutomobilManual
{
    protected void cambiarMarcha()
    {
        System.out.println("Cambiando de marcha de forma manual");
    }
}

public class AutomobilAutomatico
{
    protected void cambiarMarcha()
    {
        System.out.println("Cambiando de marcha de forma automática");
    }
}


Patróns relacionados

O patrón Método Modelo adoita relacionarse cos patróns de deseño

  • Estratexia
  • os métodos modelo usan a herencia para variar o comportamento dun algoritmo. No caso do Patrón Estratexia úsase delegación e modificase o algoritmo enteiro.
  • Métodos de fabricación
  • Os métodos de fabricación adoitan ser chamados desde os métodos modelo.

Véxase tamén

Bibliografía

  • E. Gamma, R. Helm, R. Johnson and J. Vlissides (1994). Design Patterns:elements of reusable object-oriented software. Addison-Wesley.