Série DesignPattern: Template Method

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!!

Deixe um comentário

O seu endereço de e-mail não será publicado.