Olá Pessoal,
Mais um post 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é usamos ele, mas nem nos damos conta. Porém, a ideia não é só implementar e sim saber o motivo da implementação, é entender de fato a ideia do padrão. No post de hoje vamos ver mais um exemplo prático. Vou usar Contas Bancárias como exemplo.
Lets go…
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.
Exemplo no Mundo Real (tosco + válido)
Para caminhar é preciso dar um passo para frente primeiro, isso é 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 o 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 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 temos 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();
}
//cadacontatemumataxadiferente
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 ai 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 post.
Abraços, see ya!!