Template Method

Define el esqueleto de un algoritmo en una clase base, dejando ciertos pasos a las subclases.

Contexto

Tienes varios algoritmos con la misma estructura pero pasos específicos distintos (parsear, validar, exportar).

Problema

Duplicas el esqueleto en cada implementación.

Solución

La clase base define el método Run() con el orden y llama a hooks abstractos que las subclases rellenan.

#Ejemplo en C#

public abstract class ReportGenerator
{
    public string Generate()                       // template
    {
        var data = LoadData();
        var processed = Process(data);
        return Format(processed);
    }

    protected abstract IEnumerable<Row> LoadData();
    protected virtual IEnumerable<Row> Process(IEnumerable<Row> rows) => rows;  // hook
    protected abstract string Format(IEnumerable<Row> rows);
}

public class CsvReport : ReportGenerator
{
    protected override IEnumerable<Row> LoadData() => /* desde DB */;
    protected override string Format(IEnumerable<Row> rows) => /* CSV */;
}
Cuándo NO aplicarlo

Si los pasos son muy distintos por implementación: prefiere Strategy (composición sobre herencia).

Tradeoffs
Pro Contra
Reusa el esqueleto Acopla por herencia (rígido)

#behavioral #gof #inheritance