Padrão Template Method

O Padrão Template Method é um padrão de projeto comportamental que define o esqueleto de um algoritmo na superclasse mas deixa as subclasses sobrescreverem etapas específicas do algoritmo sem modificar sua estrutura.

Problema

Imagine que sua equipe de desenvolvimento quer construir um gerador de documentos. Esse gerador de documentos toma como base um template (modelo) e define seções específicas como cabeçalho e corpo, como no modelo abaixo.

Se imaginarmos as instâncias (como o de Experiência Química acima) de relatório como classes que buscam reaproveitar código do template, para que implementem apenas os detalhes necessários para o seu relatório, como poderiamos modelar essas classes?

Hook methods

Antes de partirmos para a solução, é interessante entender o conceito de Hook Method (Método Gancho). Hook methods são métodos que permitem extensão. A superclasse possui um método principal público que é invocado pelos seus clientes (qualquer classe que queira utilizá-lo). Esse método delega parte de sua execução para o hook method, que é um método abstrato que deve ser implementado pela subclasse.

Essa técnica e muito utilizada em frameworks para permitir que as aplicações possam especializar seu comportamento para seus requisitos A aplicação deve estender essa classe e implementar o hook method de forma a inserir o comportamento especifico de seu domínio.

Hook method é uma técnica, diferentemente dos padrões que já vimos até agora. Encare ela como um recurso que a linguagem provê.

Solução

Como dito anteriormente, o Padrão Template Method “Define um esqueleto de um algoritmo, delegando alguns passos para suas subclasses.” Um modelo de documento define algumas partes que são fixas e outras partes que devem ser introduzidas quando o documento propriamente dito for criado. Assim como a intenção do Template Method.

No exemplo abaixo, buscando simplificar, temos uma classe "Template" que define um método imprimir que seria comum a todos as classes de relatório, implementa parte do algoritmo comum a todos (nesse caso o cabeçalho e rodapé) e deixa que as partes variáveis sejam definidas por quem for implementar os métodos definirIntroducao e definirCorpo, nesse caso qualquer classe que venha a estender DocumentoTemplate.

public abstract class DocumentoTemplate {

	public void imprimir() {
		StringBuffer buffer = new StringBuffer();

		// Cabeçalho
		buffer.append("INSTITUTO FEDERAL DA PARAÍBA");
		
		// Introdução
		buffer.append("INTRODUÇÃO");
		buffer.append(definirIntroducao());

		// Corpo do documento
		buffer.append(definirCorpo());

		// Rodapé
		buffer.append(LocalDateTime.now().getYear());
		System.out.println(buffer.toString());
	}

	protected abstract String definirIntroducao();

	protected abstract String definirCorpo();

}

Template Method é o principal padrão que utiliza hook methods como técnica. É aplicável quando desejamos definir um algoritmo geral, com N passos e que podem variar.

O diagrama UML a seguir demonstra a estrutura do padrão.

Com o Template Method podemos reaproveitar o código relativo à parte comum de um algoritmo, permitindo que cada passo variável possa ser definido na subclasse.

Porém, lembre-se que a herança traz alguns problemas de acoplamento.

Last updated

Was this helpful?