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
- 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.
- 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ê.”
- 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