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;
}
Clase cafe.php:

class Cafe extends BebidaCaliente
{
    protected function prepararIngrediente(): void
    {
   echo "Preparando café molido...\n";
    }

    protected function agregarCondimentos(): void
    {
   echo "Agregando azúcar y leche...\n";
    }
}
Clase te.php:

class Te extends BebidaCaliente
{
    protected function prepararIngrediente(): void
    {
   echo "Sumergiendo la bolsita de té...\n";
    }

    protected function agregarCondimentos(): void
    {
   echo "Agregando limón...\n";
    }
}
Fichero php que ejecuta el proceso:

echo '----------Preparando Café----------
'; $cafe = new Cafe(); $cafe->preparar(); echo '----------Preparando Té----------
'; $te = new Te(); $te->preparar();
La salida que produce este proceso es:

----------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.