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