Padrão de Projeto Método de Template em Java

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

Padrão de Design do Método de Modelo

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 queremos 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 porque não podemos construir janelas antes de construir a fundação. Então, neste caso, podemos criar um método de modelo que usará diferentes métodos para construir a casa. Agora, construir a fundação para uma casa é o mesmo para todos os tipos de casas, seja uma casa de madeira ou uma casa de vidro. Portanto, podemos fornecer uma implementação básica para isso, se as subclasses quiserem substituir esse método, elas podem, mas na maioria das vezes é comum para todos os tipos de casas. Para garantir que as subclasses não substituam o método de modelo, devemos torná-lo final.

Classe Abstrata do Método de Modelo

Uma vez que queremos que alguns dos métodos sejam implementados por subclasses, devemos tornar nossa classe base como uma classe abstrata. HouseTemplate.java

package com.journaldev.design.template;

public abstract class HouseTemplate {

	//método de template, 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 de template e define a ordem de execução para realizar várias etapas.

Classes Concretas de Método de Template

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 de Método de Template

Vamos testar nosso exemplo de padrão de método de template 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 método de template
		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á usando 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 Projeto de Método de Template em 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 Projeto de 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 de template, o método do modelo da superclasse chama métodos das subclasses, isso é conhecido como Princípio de Hollywood – “não nos chame, nós vamos chamar você.”
  3. Métodos na classe base com implementação padrão são referidos como Hooks e destinam-se a serem substituídos por subclasses; se você deseja que alguns dos métodos não sejam substituídos, pode torná-los finais, por exemplo, em nosso caso, podemos tornar o método buildFoundation() final porque não queremos que subclasses o substituam.

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

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