Design Pattern Template Method: Uma abordagem prática

O design pattern Template Method é um padrão de design do tipo comportamental, basicamente ele define uma estrutura para execução de um algoritmo, essa estrutura por sua vez deve ser implementada pelas subclasses, reescrevendo cada uma de suas etapas.

No mundo Java geralmente utilizamos esse design criando classes abstratas, onde definimos um método que será executado e que chamam os demais métodos que devem ser implementados por quem estender essa classe, de fato esse é um padrão bem simples de se aprender, vamos ao exemplo.

Implementação

Sua implementação é bem simples, vamos precisar criar uma classe abstrata que contém um método que chamará a ordem de execução dos demais métodos, precisamos também criar métodos abstratos que forçaram a quem estender essa classe a ter que implementá-los.

public abstract class ExemploTemplate {

	// Método que define a estrutura do algoritmo
	public final void executar() {
		passo1();
		passo2();
		passo3();
	}
	
	// Métodos que as classes devem implementar
	protected abstract void passo1();
	protected abstract void passo2();
	protected abstract void passo3();
}
ExemploTemplate.java

Nossa lógica de execução está toda descrita dentro do método “executar”, e a classe que irá estender desta deve implementar cada passo, veja a seguir.

public class ExemploConcreto extends ExemploTemplate {

	@Override
	protected void passo1() {
		System.out.println("Passo 1");
	}

	@Override
	protected void passo2() {
		System.out.println("Passo 2");
		
	}

	@Override
	protected void passo3() {
		System.out.println("Passo 3");
	}

}
ExemploConcreto.java

Observe que cada classe poderá escrever a lógica de cada passo a sua maneira, mas a ordem de execução, sempre será a mesma, vamos testar a execução.

public class ExemploTemplateMethod {

	public static void main(String[] args) {
		// Criando a instancia da nossa classe
		ExemploTemplate exemplo = new ExemploConcreto();
		
		// Executando o método padrão que possui a ordem das execuções
		exemplo.executar();
	}
}
ExemploTemplateMethod.java

Como dito anteriormente esse é um padrão muito simples e poderoso, um exemplo de uso constante desse tipo de padrão é em grandes frameworks como o Spring, diversas funcionalidades do Spring utilizam-se desse padrão, para permitir que você possa alterar o comportamento durante o desenvolvimento do seu sistema.

Observações sobre a utilização de Template Method

Esse padrão é muito utilizado e bem útil na criação de estruturas, dentro de um sistema, mas o seu uso pode nos trazer algumas dificuldades, como todo design pattern tem seus prós e contras, vamos abordar um pouco dos contras, para ajudar a esclarecer quando ele deve ser utilizado.

Um dos principais problemas desse design é a rigidez, pois uma vez que você define o algoritmo toda a sua lógica deve caber dentro daqueles passos, isso as vezes é bem complicado se tratando de desenvolvimento de software, uma dica muito importante é analisar se uma área do seu software trabalha com implementações diferentes, mas seguem basicamente os mesmos passos, essa é uma forma de identificar se cabe o uso.

Como esse design utiliza herança para compartilhar código e definir os métodos, devemos tomar cuidado pois o uso excessivo de herança pode levar a hierarquias complexas e por sua vez dificultar a manutenção ou implementação de novas funcionalidades.

Se não for definido um template assertivo, pode ocasionar de você ter muitas subclasses sendo forçadas a implementar métodos que não serão utilizados, adicionando um passo inútil na execução do seu algoritmo.

Outro ponto crucial é que a utilização de herança fará com que mudanças nessa estrutura acabem sendo um modelo em cascata, se em algum momento precisar alterar o template, terá que fazer alteração em todas as subclasses.

Se mal implementado esse design pode violar o princípio da inversão de controle, pois se a subclasse precisar chamar métodos da classe pai em alguns momentos específicos você acabará com código acoplado.

Conclusão

Sem dúvida esse é um excelente design, quando utilizado nos lugares e no momento certo, há no mercado inúmeros exemplos de sua utilização em grandes frameworks como foi mencionado anteriormente, mas a utilização excessiva pode ocasionar problemas, é importante sempre analisar com critério, antes de iniciar sua implementação, e principalmente ter um bom entendimento do negócio a qual o software que você está construindo se propõe, esse é um ponto chave que vai te ajudar na decisão de onde utilizar e quando utilizar esse pattern.

Links uteis

Mauricio Lima
Mauricio Lima

Bacharel em Ciência da Computação, profissional dedicado ao desenvolvimento de software e entusiasta da tecnologia.

Artigos: 65