Seguindo a nossa série sobre design patterns, hoje falaremos sobre o Template Method. O pattern template method é muito simples, é como se ele montasse o esqueleto de um algoritmo de uma forma abstrata, e deixasse para que as classes concretas realizem as devidas implementações. O Template Method utiliza uma classe abstrata base, que vai encapsular o template do algoritmo em um método, para que as classes concretas possam herdar desta classe e realizar a implementação de determinados passos deste algoritmo. Observe o diagrama abaixo:
 
 
 
 
 
          O diagrama acima ilustra o que foi dito acima, o template do algoritmo é encapsulado na classe base e as classes concretas podem implementam cada passo dentro do algoritmo, mas o algoritmo em si não muda. vejamos um exemplo de código:
 
 
 
 
     Já no código começamos a entender como aplicar este pattern, vemos que o template méthod é o metodo ProcessaPedido, ele é quem encapsula dentro dele o algoritmo a ser executado, note que existem alguns métodos dentro dele que representam os passos para implementação do algoritmo. Veja a figura abaixo:
 
 

     Veja que os métodos CalculaPesoPacote e CalculaFrete são abstratos, ou seja, são as classes concretas que irão definir a implementação. Existe ainda, um que é chamado método gancho que é o método CalculaDesconto, que é opcional,  as classes filhas o definem como quiser, como por exemplo o cálculo do desconto pode variar, por exemplo, de acordo com a época do ano ou dia do mês por exemplo.

     O Template method é muito útil também, quando você ainda não sabe detalhes da implementação, ou seja , você define o algoritmo através de métodos abstratos e deixa que as classes concretas o implementem. Observe um exemplo de implementação:
 
 

     Apenas para ilustrar o que foi dito até aqui, o código acima, mostra uma classe concreta em que nela serão definidos todos os detalhes para implementação do algoritmo definido na classe base. O que se nota também é que os passos do algoritmo podem ser definidos de várias formas, mas o template method, que é o que contém o algoritmo não; dentro dele estão todos os passos que não poderão mudar. Segue a definição do padrão:

“Define um esqueleto de algoritmo em um método, delegando alguns passos a sub-classes. O método permite que algumas subclasses redefinam alguns passos de um algoritmo sem mudar a estrutura do algoritmo.”

     Bom pessoal ficamos por aqui, e espero que tenha contribuido com o crescimento profissional de cada um de vocês. Os patterns são muito úteis, os vejo, como ferramentas para melhorar nosso código e mantê-lo fácil de corrigir, alterar e dar manutenção. Evoluir é preciso e as boa práticas nos ajudam a evoluir. Abraços e até a próxima.