Intención del patrón
- Define el esqueleto de un algoritmo en una operación, delegando algunos pasos a las clases derivadas del cliente. Template method permite a las subclases redefinir ciertos pasos de un algortimo sin cambiar la estructura del mismo.
- La clase base declara algoritmos "placeholders" y las clases derivadas implementan dichos algoritmos.
Ejemplo de problema
Dos componentes diferentes tienen similitudes significantes, pero no hay una interfaz o implementación común que pueda ser reutilizada. Si un cambio común a ambos componentes resulta necesario, se debe duplicar el esfuerzo en realizar ese cambio.Discusión
El diseñador del componente decide cuales son los pasos de un algortimo que no varían (o son comunes) y cuáles sí (o son personalizables). Los pasos que son comunes se implementan en una clase abstracta mientras que los otros son, tanto una implementación dada por defecto o ni siquiera son una implementación. Los pasos variantes representan "hooks" que pueden, o deben, ser provistos por el cliente del componente en una clases concreta derivada.El diseñador del componente establece los pasos solicitados de un algoritmo y el orden de los mismos pero le permite al cliente del componente extender o reemplazar alguno de esos pasos.
Template method es utilizado mayormente en framworks (estructuras reutilizables a gran escala). Cada uno implementa las piezas que no varían del dominio de una arquitectura y define "placeholders" (o hooks) para toda las opciones de personalización necesaria (o posible). Al hacerlo, el framework se transforma en el "centro del universo" y las personalizaciones del cliente son simplemente "la tercera roca desde el sol". Esta estructura de control invertida ha sido llamada afectuosamente: "El principio Hollywood": "No nos llame, nosotros lo llamaremos".
Estructura
La implementación de template_method() es: llamar al step_one(), llamar al step_two() y llamar al step_tree(). El método step_two() es un hook. Está declarado en la clase base y definido en las clases derivadas. Los frameworks usan mucho este patrón. Todo el código reutilizables es definido en las clases base del framework y los clientes del mismo son libres de definir personalizaciones mediante la creación de clases derivadas; tantas como sean necesarias.
Ejemplo
El patrón Template method define el esqueleto de un algoritmo en una operación y delega algunos pasos en clases derivadas. Los constructores de casas usan este patrón cuando desarrollan una nueva subdivisión. Una subdivisión típica consta de una cantidad limitada de planos de planta con diferentes variaciones cada uno. Dentro de un plano de planta, la base, el encuadre, la plomería y el cableado será idéntico para cada casa. Las variaciones se introducen en las etapas posteriores de la construcción para construir una variedad más amplia de modelos.Check list
- Examinar el algoritmo y decidir qué pasos son comunes y cuales son peculiares a cada una de las clases actuales.
- Definir una nueva clase base abstracta para contener al framework "no nos llame, nosotros lo llamaremos".
- Mover la cáscara del algoritmo (ahora llamada Template method) y la definición de todos los pasos comunes a la nueva clase base.
- Definir un método "hook" en la clase base por cada paso que requiera diferentes implementaciones (puede ser definido como abstract en C# o Java). Dicho método puede tener una implementación por defecto.
- Invocar el/los método(s) hook desde el Template method.
- Cada una de las clases existente declara una relación "es un" con respecto a la nueva clase base abstracta.
- Remover de las clases existentes todos los detalles de implementación que haya sido movidos a la clase base.
- Los únicos detalles que deben permanecer en las clases existentes será la implementación de los detalles peculiares de cada clase derivada.
Reglas prácticas
- El patrón Strategy es similar a Template method excepto por su granularidad.
- Template method usa la herencia para variar parte de un algoritmo. Strategy usa la delegación para variar el algoritmo entero.
- Strategy modifica la lógica de objetos individuales. Template method modifica la lógica de una clase entera.
- Factory method es una especialización de Template method.
Ejemplo de código en C#
using System;
class MainApp
{
static void Main()
{
AbstractClass c;
c = new ConcreteClassA();
c.TemplateMethod();
c = new ConcreteClassB();
c.TemplateMethod();
// Wait for user
Console.Read();
}
}
// "AbstractClass"
abstract class AbstractClass
{
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
// The "Template method"
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
// "ConcreteClass"
class ConcreteClassA : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");
}
}
class ConcreteClassB : AbstractClass
{
public override void PrimitiveOperation1()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");
}
public override void PrimitiveOperation2()
{
Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");
}
}
ConcreteClassA.PrimitiveOperation1()
ConcreteClassA.PrimitiveOperation2()
ConcreteClassA.PrimitiveOperation2()
0 comentarios:
Publicar un comentario
Muchas gracias por leer el post y comentarlo.