Padrão de projeto Template Method em java

O padrão de projeto template method ou método template é um padrão utilizado para definir o esqueleto de um algoritmo em uma operação, postergando alguns passos para algumas subclasses. Neste tutorial explicaremos de forma mais detalhada o que é este padrão, além de trazermos um exemplo real de como utilizá-lo.

O que é um padrão de projeto?

Em poucas palavras, um padrão de projeto é uma solução elegante para um problema recorrente no dia-a-dia do desenvolvedor. Em geral, os padrões visam facilitar a reutilização de soluções de desenho de software.

Neste tutorial vamos tratar de um dos padrões mais fácil de ser entendido e implementado, o template method.

O que é o padrão de projeto template method?

O Template Method é um padrão de projeto criado por Erich Gamma, Ralph Johnson, Richard Halm, John Vlissides e classificado como um padrão de projeto Comportamental de classe. O template method basicamente define o esqueleto de um algoritmo numa operação, deixando que subclasses completem algumas das etapas.

O livro Soluções reutilizáveis de software orientado a objetos traz a seguinte definição para o template method:

Definir o esqueleto de um algoritmo em uma operação, postergando alguns passos para as subclasses. Template Method permite que subclasses redefinam certos passos de um algoritmo sem mudar a estrutura do mesmo.

O Template Method fornece uma estrutura fixa, de um algoritmo, esta parte fixa deve estar presente na superclasse, sendo obrigatório uma classeAbstrata que possa conter um método concreto, pois em uma interface só é possível conter métodos abstratos que definem um comportamento, esta é a vantagem de ser uma Classe Abstrata porque também irá fornecer métodos abstratos às suas subclasses, que por sua vez herdam este método, por Herança (programação), e devem implementar os métodos abstratos fornecendo um comportamento concreto aos métodos que foram definidos como abstratos. Com isso certas partes do algoritmo serão preenchidos por implementações que irão variar, ou seja, implementar um algoritmo em um método, postergando a definição de alguns passos do algoritmo, para que outras classes possam redefiní-los.

  • Nome do padrão: Template Method
  • Classificação: Comportamental de classe
  • Criador: Erich Gamma, Ralph Johnson, Richard Halm, John Vlissides
LEIA TAMBÉM  Maven - Primeiros passos

Estrutura do template method

Estrutura do Template Method em Java-estrutura
Estrutura do Template Method em Java

 

A estrutura do template method é basicamente um método concreto onde haverá o template propriamente, fazendo uso de fragmentos menores separados em métodos abstratos que serão implementados conforme necessidade.

public abstract class AbstractClass {
  
  public final void templateMethod() {
    operacao1();
    operacao2();
    operacao3();

  }

  protected abstract void operacao1();
  protected abstract void operacao2();
  protected abstract void operacao3();

}

 

public class ClasseConcreta1 extends AbstractClass {

  @Override
  public void operacao1() {
    System.out.println("Operacao 1");
  }

  @Override
  public void operacao2() {
    System.out.println("Operacao 2");
  }

  @Override
  public void operacao3() {
    System.out.println("Operacao 3");
  }

}

 

public class ClasseConcreta2 extends AbstractClass {

  @Override
  public void operacao1() {
    System.out.println("Operacao 1");
  }

  @Override
  public void operacao2() {
    System.out.println("Operacao 2");
  }

  @Override
  public void operacao3() {
    System.out.println("Operacao 3");
  }

}

Uma estrutura um pouco mais real se pareceria com este código que segue abaixo:

public abstract class AbstractClass {
  
  public final void templateMethod() {
    if (condicao()) {
      fazAlgo();
    }else{
      fazOutraCoisa();
    }
  }

  protected abstract boolean condicao();
  protected abstract void fazAlgo();
  protected abstract void fazOutraCoisa();

}

O código de teste e a saída para cada um dos casos segue abaixo:

public static void main(String[] args) {
    Bolo boloChocolate = new BoloChocolate();
    boloChocolate.fazerBolo();
}

//saída no console

separando farinha
separando ...
separando chocolate
separando outros....
preparando a massa de chocolate....
Assando o bolo em 180 °C, preaquecido por 40 minutos
Servindo o bolo

 

public static void main(String[] args) {
    Bolo boloFuba = new BoloFuba();
    boloFuba.fazerBolo();
}

//saida no console

separando farinha
separando ...
separando fubá
separando outros....
preparando a massa do bolo de fubá....
 Assando o bolo em 180 °C, preaquecido por 30 minutos
Servindo o bolo

Vamos agora a uma implementação real do template method?

Implementando o template method

Como disse um jovem programador, “um bom exemplo vale mais que mil tutoriais”. Vamos então a um exemplo de aplicação real com o template method.

Descrição problema

Para um exemplo hipotético, digamos que nosso programador de nome João necessite criar um código para criação de bolo. Neste exemplo, João necessita de códigos para a criação de bolo de chocolate e bolo de fubá, mas sabe que a qualquer momento seu chefe lhe pedirá a criação de códigos para bolo de laranja, milho e muitos outros tipos de bolo.

LEIA TAMBÉM  Como criar um hello world com Java Web e Maven de forma fácil

Solução 1

João pode criar um código que faça o bolo de chocolate, copiar o código para o bolo de fubá e editar somente as partes especificas para este último. Agora imaginemos o problema quando seu chefe pedir o décimo sabor de bolo. Teremos 10 códigos semelhantes com apenas algumas variações em cada.

Não, definitivamente esta não é a melhor solução…

Solução 2

Utilizar o template method para escrever o código genérico, e fazer uso de métodos abstratos que serão implementados por cada solução mais específica, como separar os ingredientes, por exemplo.

Vamos aos códigos?

public abstract class Bolo {
  
  //aqui vai o método de template
  public void fazerBolo(){
    separaIngredientes();
    preparaMassa();
    assaBolo();
    System.out.println("Servindo o bolo");
  }

  protected abstract void assaBolo();
  protected abstract void preparaMassa();
  protected abstract void separaIngredientes() ;

}

 

public class BoloChocolate extends Bolo{

  @Override
  public void separaIngredientes() {
    System.out.println("separando farinha");
    System.out.println("separando ...");
    System.out.println("separando chocolate");
    System.out.println("separando outros....");
  }
  
  @Override
  public void preparaMassa() {
    System.out.println("preparando a massa de chocolate....");
  }
  
  @Override
  public void assaBolo() {
    System.out.println("Assando o bolo em 180 °C, preaquecido por 40 minutos");
  }

}

 

public class BoloFuba extends Bolo{

  @Override
  protected void separaIngredientes() {
    System.out.println("separando farinha");
    System.out.println("separando ...");
    System.out.println("separando fubá");
    System.out.println("separando outros....");
  }
  
  @Override
  protected void preparaMassa() {
    System.out.println("preparando a massa do bolo de fubá....");
  }
  
  @Override
  protected void assaBolo() {
    System.out.println("Assando o bolo em 180 °C, preaquecido por 30 minutos");
  }

}

 

Quando usar o Template Method?

Devemos utilizar o template method quando temos diferentes algoritmos que possuem estruturas parecidas. Nestes casos, o Template Method é uma boa solução. Com ele, conseguimos definir, em um nível mais macro, a estrutura do algoritmo e deixar algumas lógicas, que serão implementados de maneira diferente por cada uma das implementações específicas. Dessa forma, reutilizamos ao invés de repetirmos código, e facilitamos possíveis evoluções, tanto do algoritmo em sua estrutura macro, quanto dos detalhes do algoritmo, já que cada classe tem sua responsabilidade bem separada.

LEIA TAMBÉM  Hello world em Java

FONTES:

Livros
METSKER, Steven John. PADRÕES DE PROJETO EM JAVA
GAMMA, Erich et al. Padrões de Projeto: SOLUÇÕES REUTILIZÁVEIS DE SOFTWARE ORIENTADO A OBJETOS.

Internet
WIKIPÉDIA – Template Method
WIKIPEDIA – Padrão de projeto de Software
Curso Alura de Design Patterns em Java
Blog do Thiengo – Padrão de Projeto: Template Method (Método Template)
Portal DPI – Padrão de Projeto: Template Method

Conclusão

Neste tutorial abordamos um pouco do template method. Conforme vimos, este padrão de projeto nos auxilia na criação de códigos reutilizáveis em cenários onde há a necessidade de pequenas variações no código ou ao menos uma estrutura bem parecida para diversos casos semelhantes. Em todos estes casos, o Template Method é uma ótima solução.

Bons códigos e até a próxima 😉

Baixe o código do Exemplo do padrão de projeto Template Method em Java no Github

Julio Victorio

Julio Victorio

Analista e desenvolvedor de sistemas em TI - Tecnologia e Inovação
Júlio Victório trabalha com web há mais de 10 anos, atualmente é desenvolvedor Java e ama escrever e trabalhar com tecnologia.
Julio Victorio
About Author:
Júlio Victório trabalha com web há mais de 10 anos, atualmente é desenvolvedor Java e ama escrever e trabalhar com tecnologia.