Mais um artigo da série “Design Pattern não é receita de bolo”. E hoje vamos conhecer um padrão comportamental chamado de Template Method. Ele é bem simples – na verdade até já o usamos, mas nem nos damos conta. Porém, a ideia não é só implementar e saber o motivo da implementação; é entender de fato a ideia do padrão. No artigo de hoje vamos ver mais um exemplo prático: contas bancárias.
Template Method
É um padrão do tipo comportamental que define a ordem na qual determinados passos devem ser realizados na resolução do problema. Porém, esses passos podem ser realizados de forma diferentes.
Um exemplo no mundo real (meio bobo, porém válido) é que para caminhar é preciso dar um passo para frente primeiro. Essa é a ordem definida pelo sistema do corpo humano. Porém, a forma que daremos esse passo pode ser diferente de acordo com cada pessoa.
Outro exemplo: um banco tem vários tipos de conta: universitária, corrente, poupança, digital etc. Para cada tipo de conta o banco cobra uma taxa diferente, mas independente do tipo de conta, o cliente precisa depositar e sacar dinheiro.
O template method é baseado em métodos abstratos que serão implementados por classes concretas. No diagrama a seguir podemos ver:

Simples, não? Acredito que você já deve ter desenvolvido alguma classe nesse contexto.
Praticando
Vamos praticar e ver as coisas acontecendo à nível de código. A seguir, criaremos a nossa classe abstract que tem o template method, que nada mais é que um método abstract:
Conta.java:
package br.com.camilolopes.templatemethod;
/*
* classe que tem os template method baseados
* em métodos abstratos
*/
public abstract class Conta {
private double saldo;
public void deposita(double valor){
saldo = valor;
}
public void saque(double valor){
saldo -=valor;
saldo -=this.taxaConta();
}
//cada conta tem uma taxa diferente
public abstract double taxaConta();
public double getSaldo() {
return saldo;
}
}
Agora, criaremos a classe corrente e poupança:
Corrente.java:
package br.com.camilolopes.classes;
import br.com.camilolopes.templatemethod.Conta;
public class Corrente extends Conta {
@Override
public double taxaConta() {
return 0.1;
}
}
Poupanca.java:
package br.com.camilolopes.classes;
import br.com.camilolopes.templatemethod.Conta;
/*
* classe que implementa o método abstract que sao utilizados pelos templates methods
*/
public class Poupanca extends Conta {
@Override
public double taxaConta() {
return 0.5;
}
}
Para testarmos, vamos criar a classe com método main e verificar se para cada tipo de conta as taxas foram cobradas corretamente:
ContaMain.java:
package br.com.camilolopes.main;
import br.com.camilolopes.classes.Corrente;
import br.com.camilolopes.classes.Poupanca;
public class ContaMain {
public static void main(String[] args) {
Corrente corrente = new Corrente();
corrente.deposita(100.00);
corrente.saque(10.00);
System.out.println("Saldo em conta corrente " + corrente.getSaldo());
Poupanca poupanca = new Poupanca();
poupanca.deposita(100.00);
poupanca.saque(10.00);
System.out.println("Saldo em Poupança " + poupanca.getSaldo());
}
}
Agora é só rodar para ver o resultado.
Resultado
A seguir, temos o resultado no console:

É isso, pessoal! Nada mais que isso para o padrão template method. Muito simples, né? Porém, a ideia é pegar o conceito principal do padrão e analisar com o problema que você tem e ver se ele se enquadra.
Vou ficando por aqui. Espero que tenham gostado do artigo de hoje.







