PATRÓN TEMPLATE METHOD EN PHP: QUÉ ES Y CÓMO IMPLEMENTARLO
El patrón Template Method es un patrón de diseño de comportamiento que permite definir el orden de ejecución de un algoritmo en una clase base, mientras que las subclases pueden personalizar ciertos pasos sin modificar la estructura general, siendo perfecto cuando se tienen varios algoritmos que son similares en estructura pero que difieren en algunos pasos específicos.Ejemplo
En el siguiente ejemplo se muestra el proceso de preparación de bebidas calientes:Clase princial
abstract class BebidaCaliente
{
// Este es el Template Method
final public function preparar(): void
{
$this->hervirAgua();
$this->prepararIngrediente();
$this->verterEnTaza();
$this->agregarCondimentos();
}
protected function hervirAgua(): void
{
echo "Hirviendo agua...\n";
}
protected function verterEnTaza(): void
{
echo "Vertiendo en la taza...\n";
}
// Pasos que deben implementar las subclases
abstract protected function prepararIngrediente(): void;
abstract protected function agregarCondimentos(): void;
}
class Cafe extends BebidaCaliente
{
protected function prepararIngrediente(): void
{
echo "Preparando café molido...\n";
}
protected function agregarCondimentos(): void
{
echo "Agregando azúcar y leche...\n";
}
}
class Te extends BebidaCaliente
{
protected function prepararIngrediente(): void
{
echo "Sumergiendo la bolsita de té...\n";
}
protected function agregarCondimentos(): void
{
echo "Agregando limón...\n";
}
}
echo '----------Preparando Café----------
';
$cafe = new Cafe();
$cafe->preparar();
echo '----------Preparando Té----------
';
$te = new Te();
$te->preparar();
----------Preparando Café----------
Hirviendo agua...
Preparando café molido...
Vertiendo en la taza...
Agregando azúcar y leche...
----------Preparando Té----------
Hirviendo agua...
Sumergiendo la bolsita de té...
Vertiendo en la taza...
Agregando limón...
Ventajas
- Evita duplicación de código, el algoritmo común está en un solo lugar.
- Controla el flujo del algoritmo, el método final evita que se sobrescriba.
- Facilita la extensibilidad, solo se crean nuevas subclases.
¿Cuándo usarlo?
- Cuando varios algoritmos siguen los mismos pasos pero difieren en algunos.
- Procesamiento de datos, como CSV, JSON, XML.
- Generación de reportes.
- Algoritmos de juegos como turnos, inicialización, etc..
- Frameworks, hooks que el usuario puede sobreescribir.