Padrão de Projeto Template Method em Java

O Template Method é um padrão de design comportamental. O padrão de design Template Method é usado para criar um esboço de método e adiar algumas etapas da implementação para as subclasses.

Padrão de Design Template Method

O método de modelo define as etapas para executar um algoritmo e pode fornecer uma implementação padrão que pode ser comum para todas ou algumas das subclasses. Vamos entender esse padrão com um exemplo. Suponha que queiramos fornecer um algoritmo para construir uma casa. As etapas que precisam ser realizadas para construir uma casa são – construir a fundação, construir pilares, construir paredes e janelas. O ponto importante é que não podemos alterar a ordem de execução, pois não podemos construir janelas antes de construir a fundação. Portanto, neste caso, podemos criar um método de modelo que usará diferentes métodos para construir a casa.

A construção da fundação para uma casa é a mesma para todos os tipos de casas, seja uma casa de madeira ou uma casa de vidro. Portanto, podemos fornecer uma implementação base para isso. Se as subclasses quiserem substituir esse método, podem fazer isso, mas na maioria das vezes é comum a todos os tipos de casas. Para garantir que as subclasses não substituam o método de modelo, devemos torná-lo final.

Classe Abstrata Template Method

Como queremos que alguns dos métodos sejam implementados por subclasses, precisamos tornar nossa classe base uma classe abstrata. HouseTemplate.java

package com.journaldev.design.template;

public abstract class HouseTemplate {

	//método do modelo, final para que subclasses não possam sobrescrever
	public final void buildHouse(){
		buildFoundation();
		buildPillars();
		buildWalls();
		buildWindows();
		System.out.println("House is built.");
	}

	//implementação padrão
	private void buildWindows() {
		System.out.println("Building Glass Windows");
	}

	//métodos a serem implementados por subclasses
	public abstract void buildWalls();
	public abstract void buildPillars();

	private void buildFoundation() {
		System.out.println("Building foundation with cement,iron rods and sand");
	}
}

buildHouse() é o método do modelo e define a ordem de execução para realizar várias etapas.

Classes Concretas do Método do Modelo

Podemos ter diferentes tipos de casas, como Casa de Madeira e Casa de Vidro. WoodenHouse.java

package com.journaldev.design.template;

public class WoodenHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Wooden Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with Wood coating");
	}

}

Poderíamos ter sobrescrito outros métodos também, mas por simplicidade, não estou fazendo isso. GlassHouse.java

package com.journaldev.design.template;

public class GlassHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Glass Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with glass coating");
	}

}

Cliente do Padrão de Projeto do Método do Modelo

Vamos testar nosso exemplo de padrão de método do modelo com um programa de teste. HousingClient.java

package com.journaldev.design.template;

public class HousingClient {

	public static void main(String[] args) {
		
		HouseTemplate houseType = new WoodenHouse();
		
		//usando o método do modelo
		houseType.buildHouse();
		System.out.println("************");
		
		houseType = new GlassHouse();
		
		houseType.buildHouse();
	}

}

Observe que o cliente está invocando o método de template da classe base e, dependendo da implementação de diferentes etapas, está utilizando alguns dos métodos da classe base e alguns deles da subclasse. A saída do programa acima é:

Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.

Diagrama de Classe do Método de Template

Padrão de Design do Método de Template no JDK

  • Todos os métodos não abstratos de java.io.InputStream, java.io.OutputStream, java.io.Reader e java.io.Writer.
  • Todos os métodos não abstratos de java.util.AbstractList, java.util.AbstractSet e java.util.AbstractMap.

Pontos Importantes do Padrão de Design do Método de Template

  1. O método de template deve consistir em certas etapas cuja ordem é fixa e, para alguns dos métodos, a implementação difere da classe base para a subclasse. O método de template deve ser final.
  2. Na maioria das vezes, subclasses chamam métodos da superclasse, mas no padrão template, o método template da superclasse chama métodos das subclasses, isso é conhecido como Princípio de Hollywood – “não nos ligue, nós te ligaremos.”.
  3. Métodos na classe base com implementação padrão são referidos como Ganchos e são destinados a serem sobrescritos pelas subclasses, se você quer que alguns dos métodos não sejam sobrescritos, você pode torná-los finais, por exemplo, no nosso caso, podemos tornar o método buildFoundation() final porque se não queremos que subclasses o sobrescrevam.

Isso é tudo sobre o padrão de design de método template em java, espero que tenha gostado.

Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java