
El patrón Template Method
El patrón Template Method busca simplificar, mediante la llamada a un método, la resolucion de un algoritmo con diferentes partes y cuya lógica depende de las clases concretas.
Por ejemplo, pongamos que queremos preparar pasta. Para hacer pasta todos los platos requieren cocer la pasta y añadirle sal y/o diversas hierbas. Si no abstraemos la lógica común a todos los platos tendremos código duplicado entre clases, algo que no queremos que ocurra.

Otros métodos como hervirAgua() y echarSal() no dependerán de la implementación concreta, por lo que podremos implementarlos en la propia clase abstracta. Los métodos que verdaderamente nos interesa obligar a implementar en las clases concretas son los que varían, y que también serán llamados por el método de la clase abstracta que ejecuta el algoritmo, preparar().

¿Y qué pasa si queremos saltarnos un paso del algoritmo definido en el Template Method? Es posible que a alguien le guste la pasta sin añadir ningún condimento. En este caso tendríamos que evitar que el método preparar() de Pasta ejecutase el método condimentar() condicionalmente. Esto lo denominamos como un hook, un «gancho» en mitad de la ejecución a través del cual podemos modificar el comportamiento del método.
El patron Template Method nos rodea por todas partes. Está en todos lado. Allí donde necesitemos sobreescribir un método de una clase abstracta para dotar de funcionalidad a nuestra clase concreta, hay un Template Method. Los frameworks se nuetren de eso. Cuando queremos implementar una lógica específica entre muchas que podríamos implementar, por ejemplo, a la hora de comparar dos objetos, estamos usando un Template Method. Es posiblemente un patrón que estamos muy acostumbrados a usar gracias a la ligica de la herencia pero que contiene truquitos como los hooks que son convenientes tener en cuenta.